我在 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 似乎有所不同。
有任何想法吗?非常感谢您的建议和想法。