我在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,似乎有所不同。
有什么想法吗?非常感谢你们的建议和想法。
答案 0 :(得分:2)
啊,愚蠢的事情在内部仍然可见,即使父母已经崩溃,用户也没有看到它。那就是答案。
http://msdn.microsoft.com/en-us/library/ms745058.aspx
http://msdn.microsoft.com/en-us/library/system.windows.uielement.visibility.aspx