我有以下 XAML:
<Grid>
<StackPanel>
<local:MyControl Background="Blue" AnotherControl="{x:Reference anotherControl}"/>
<local:MyAnotherControl Background="Red" x:Name="anotherControl"/>
</StackPanel>
</Grid>
问题是当我在 MyControl 的 MeasureOverride 中返回 (100, 20) 时。想在 MyControl 的 ArrangeOverride 中返回我收到的最终大小。因此 MyControl 的 ActualWidth 与 Window 相同。
到目前为止一切都很好,但是当我在 MyControl 的 ArrangeOverride 中并且在我返回大小之前,我使 MyAnotherControl 的度量无效。
最终结果是正在测量 MyAnotherControl,但在排列过程中,因此它没有通知 StackPanel MyAnotherControl 的所需大小已更改。此外,结果 StackPanel 未正确显示。
在我看来,当我在安排通过时使控件无效时,我在 wpf 中发现了奇怪的行为。MyAnotherControl 没有通知它的父级 Stackpanel 大小已更改,但它应该。
有什么解决办法吗?
如果您调整窗口大小,它将正确排列和绘制。为什么?
有两条条纹。蓝色的一个和红色的一个。红色应该以另一个高度出现,但它不会。当您调整窗口大小并强制重新测量时,它会起作用。为什么会发生这种奇怪的行为?
public class MyControl : Button
{
public MyAnotherControl AnotherControl
{
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);
AnotherControl.MyHeight = 50;
AnotherControl.InvalidateMeasure();
return arrangeBounds;
}
}
public class MyAnotherControl : Button
{
public double MyHeight
{
get;
set;
}
protected override Size MeasureOverride(Size constraint)
{
base.MeasureOverride(constraint);
return new Size(100, this.MyHeight > 0 ? this.MyHeight : 10);
}
protected override Size ArrangeOverride(Size arrangeBounds)
{
base.ArrangeOverride(arrangeBounds);
return arrangeBounds;
}
}