1

我在 WPF 中偶然发现了一些有趣的东西,我无法向自己解释。

这是一种奇怪的行为。

标题基本上说明了一切。

这是一个示例,其中我将 Grid.Visibility 设置为 Collapsed,并使该 Grid 内的控件的度量无效。即使认为不应该重新测量该控件,因为在 wpf 中不可见的控件没有被测量。

public class MyControl : Button
{
    public MyAnotherControl AnotherControl
    {
        get;
        set;
    }

    public Grid Grid
    {
        get;
        set;
    }

    protected override Size MeasureOverride(Size constraint)
    {
        base.MeasureOverride(constraint);
        return new Size(100, 20);
    }

    protected override Size ArrangeOverride(Size arrangeBounds)
    {
        base.ArrangeOverride(arrangeBounds);
        return arrangeBounds;
    }

    protected override void OnClick()
    {
        Grid.Visibility = Visibility.Collapsed;
        AnotherControl.InvalidateMeasure();
        base.OnClick();
    }
}

这是我在 Grid 中的另一个控件。

public class MyAnotherControl : Button
{
    protected override Size MeasureOverride(Size constraint)
    {
        base.MeasureOverride(constraint);
        Console.WriteLine("Measure called");
        return new Size(100, 10);
    }

    protected override Size ArrangeOverride(Size arrangeBounds)
    {
        base.ArrangeOverride(arrangeBounds);
        return arrangeBounds;
    }
}

这是 XAML:

    <Grid>
        <StackPanel>
            <local:MyControl Background="Blue" Grid="{x:Reference grid}" AnotherControl="{x:Reference anotherControl}"/>
            <Grid x:Name="grid">
                <local:MyAnotherControl Content="{Binding}" Background="Red" x:Name="anotherControl"/>
            </Grid>
        </StackPanel>
    </Grid>

如您所见,OnClick 我更改了 Grid.Visibility 并使网格内部控件的度量无效。

根据 MSDN:

可见性不可见的元素不参与输入事件(或命令),不影响布局的测量或排列通道,不在制表符序列中,并且不会在命中测试中报告。

http://msdn.microsoft.com/en-us/library/system.windows.uielement.visibility.aspx

问题是为什么不应该测量 MyAnotherControl ?

如果我将代码更改为从一开始就折叠的网格,则在使度量无效时不再重新度量 MyAnotherControl。这代表正确的 wpf 行为。

    <Grid>
        <StackPanel>
            <local:MyControl Background="Blue" Grid="{x:Reference grid}" AnotherControl="{x:Reference anotherControl}"/>
            <Grid x:Name="grid" Visibility="Collapsed">
                <local:MyAnotherControl Content="{Binding}" Background="Red" x:Name="anotherControl"/>
            </Grid>
        </StackPanel>
    </Grid>

是否从一开始就设置 Visibility 似乎有所不同。

有任何想法吗?非常感谢您的建议和想法。

4

1 回答 1

2

Ahhh 愚蠢的东西在内部仍然可见,即使父级被折叠并且用户没有看到它。这就是答案。

http://msdn.microsoft.com/en-us/library/ms745058.aspx

http://msdn.microsoft.com/en-us/library/system.windows.uielement.visibility.aspx

于 2013-10-18T13:10:10.270 回答