为啥我的面板在小于明确尺寸时会一直夹在面板周围?
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 上有一篇很棒的博文。
【讨论】:
太棒了。谢谢!你救了我更多的心痛。这确实是个烦人的小方法。以上是关于为啥我的面板在小于明确尺寸时会一直夹在面板周围?的主要内容,如果未能解决你的问题,请参考以下文章