5

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

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

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

在此处输入图像描述

我尝试将剪辑设置为大于网格。

我能够避免这种情况的唯一方法是编写一个自定义面板,用 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>

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

4

1 回答 1

10

确定剪辑的方式涉及三件事。前两个是ClipToBoundsClip,但第三个有点烦人,那就是GetLayoutClip

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

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

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

这里有一篇很棒的博客文章。

于 2011-04-27T23:59:54.293 回答