为啥我的面板在小于明确尺寸时会一直夹在面板周围?

Posted

技术标签:

【中文标题】为啥我的面板在小于明确尺寸时会一直夹在面板周围?【英文标题】:Why do my panels clip all the way around the panel when made smaller than the explicit size?为什么我的面板在小于明确尺寸时会一直夹在面板周围? 【发布时间】:2011-08-14 05:22:10 【问题描述】:

可能是一个令人困惑的问题标题。

带有红色矩形的网格是其外观示例。

带有蓝色矩形的网格(未出现在图像中)具有强制第二个网格小于我明确设置的边距。这似乎会导致 WPF 翻转并隐藏其安排范围之外的所有内容。

我尝试将 Clip 设置为大于 Grid。

我能够避免这种情况的唯一方法是编写一个自定义面板,该面板使用 PositiveInfinity 的约束来测量它的子级,然后以正确的宽度排列子级。这种方法有很多问题。对孩子撒谎是不好的。

不管怎样,代码如下:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="NegativeMarginTooMuchClipping.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640"
Height="400">

<Grid>
    <StackPanel Width="600" Height="300">
    <Grid Margin="40,50,60,50" Background="#FFB8B8B8" Width="500" Height="50">
        <Rectangle Fill="Red" HorizontalAlignment="Left" Height="50" VerticalAlignment="Top" Width="50" Margin="0,-50,0,0"/>
    </Grid>
    <Grid Margin="40,50,61,50" Background="#FFB8B8B8" Width="500" Height="50">
        <Rectangle Fill="Blue" HorizontalAlignment="Left" Height="50" VerticalAlignment="Top" Width="50" Margin="0,-50,0,0"/>
    </Grid>
    </StackPanel>
</Grid>

已知问题?我做错了吗?需要更多说明吗?

【问题讨论】:

首先将蓝色矩形移动到网格之外,然后将它移动到 StackPanel 边界,蓝色矩形不好玩。 【参考方案1】:

要确定剪辑的方式,需要考虑三件事。前两个是ClipToBounds和Clip,但第三个有点烦人,那就是GetLayoutClip。

默认情况下,对于 UIElement,GetLayoutClip 方法将返回 null 或与元素大小相同的 RectangleGeometry,具体取决于 ClipToBounds 属性。不过,FrameworkElement 和它的派生词要复杂得多。看看 Reflector/ILSpy,你就会明白我的意思了。

不过,您可以覆盖此行为。如果您使用以下内容作为蓝色矩形的网格,则它将不再被剪裁:

public class MyGrid : Grid 
    protected override Geometry GetLayoutClip(Size layoutSlotSize) 
        return null;
    

here 上有一篇很棒的博文。

【讨论】:

太棒了。谢谢!你救了我更多的心痛。这确实是个烦人的小方法。

以上是关于为啥我的面板在小于明确尺寸时会一直夹在面板周围?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 GridBagLayout 尊重按钮或面板的最小尺寸?

C# 在面板周围拖动控件

UI 面板没有根据屏幕尺寸定位自己

Winforms 面板尺寸

关于高度和宽度的 Grafana 面板错误

为啥我的 ExtJS 4.2 网格面板排序不起作用?