当面板尺寸小于显式尺寸时,为什么我的面板会一直夹在面板周围?

chr*_*son 5 wpf layout margin clipping panel

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

具有红色矩形的网格是它应该如何看的示例.

具有蓝色矩形的网格(未出现在图像中)具有一个边距,迫使第二个网格小于我明确设置的网格.这似乎导致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>
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*ked 8

确定某些内容的方式有三个方面.前两个是ClipToBoundsClip,但第三个是更烦人的,那就是GetLayoutClip.

默认情况下,对于UIElement,GetLayoutClip方法将返回null或与元素大小相同的RectangleGeometry,具体取决于ClipToBounds属性.尽管如此,FrameworkElement及其衍生产品要复杂得多.看一下Reflector/ILSpy,你就会明白我的意思.

您可以覆盖此行为.如果你使用类似下面的东西作为蓝色矩形的网格,那么它将不再被剪裁:

public class MyGrid : Grid {
    protected override Geometry GetLayoutClip(Size layoutSlotSize) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

在灯架上有一个伟大的博客文章在这里.