当父母崩溃时,为什么儿童测量仍然有效?

时间:2013-10-18 10:33:04

标签: wpf

我在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,似乎有所不同。

有什么想法吗?非常感谢你们的建议和想法。

1 个答案:

答案 0 :(得分:2)

啊,愚蠢的事情在内部仍然可见,即使父母已经崩溃,用户也没有看到它。那就是答案。

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

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