0

我有以下 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;
    }
}
4

1 回答 1

2

这就是 wpf 的工作原理。stackpanel 只是枚举它的孩子并在它的排列中调用它们的排列。如果您对尺寸无效的元素调用排列,它将使用最后可用的尺寸重新测量。不会调用父级的 onchilddesiredsizechanged,因此不会使父级的度量值无效。您可能应该只获取兄弟的视觉父级并使其度量无效。

于 2013-10-17T01:03:42.107 回答