好吧,就在我以为我想出了布局系统的时候,我碰到了一堵砖墙...

因此,我有一个带有自定义ItemsControl的WPF窗口,其中的Items面板是一个自定义Panel,每个ItemContainer是一个自定义元素。

当窗口调用了InvalidateArrange()时,ArrangeOverride()调用的顺序似乎很好,即

Window -> List -> ItemsPanel -> ItemContainer -> ItemContainer -> etc...

问题是,我有一些代码要在ArrangeOverride依赖于所有ItemContainers进行排列和调整大小之后在Window级别调用。窗口级别的ArrangeOverride()在调用树的下一个项目(列表)之前结束。

有没有一种方法可以测量所有Windows子级,然后返回Windows ArrangeOverride()以继续执行某些代码,或者是否有要挂接到的事件?

干杯

最佳答案

您可以在窗口的ArrangeOverride实现中调用base.ArrangeOverride()之后再调用自定义代码:

    protected override Size ArrangeOverride(Size arrangeBounds)
    {
        Size temp = base.ArrangeOverride(arrangeBounds);

        // custom code goes here!

        return temp;
    }

(我刚刚进行了测试,它可以正常工作:自定义代码是在窗口中任何子控件的ArrangeOverride之后执行的)

编辑:
遵循经过测试且可以正常工作的示例:

在window1.xaml.cs中:
[...]
protected override Size ArrangeOverride(Size arrangeBounds)
{
    Trace.TraceInformation("Window1.ArrangeOverride START");
    Size temp = base.ArrangeOverride(arrangeBounds);
    Trace.TraceInformation("Window1.ArrangeOverride END");
    return temp;
}
[...]

在myUserControl.xaml.cs中:
[...]
protected override Size ArrangeOverride(Size arrangeBounds)
{
    Trace.TraceInformation("{0}.ArrangeOverride START", Tag);
    Size s = base.ArrangeOverride(arrangeBounds);
    Trace.TraceInformation("{0}.ArrangeOverride END", Tag);
    return s;
}
[...]

在window1.xaml中:
[...]
<local:myUserControl Tag="FirstLevelControl">
    <StackPanel>
        <local:myUserControl Tag="SecondLevelControl_1">
            <TextBlock>First</TextBlock>
        </local:myUserControl>
        <local:myUserControl Tag="SecondLevelControl_2">
            <TextBlock>Second</TextBlock>
        </local:myUserControl>
    </StackPanel>
</local:myUserControl>
[...]

最后,执行后的输出:
[...]
Test.vshost.exe Information: 0 : Window1.ArrangeOverride START
Test.vshost.exe Information: 0 : FirstLevelControl.ArrangeOverride START
Test.vshost.exe Information: 0 : SecondLevelControl_1.ArrangeOverride START
Test.vshost.exe Information: 0 : SecondLevelControl_1.ArrangeOverride END
Test.vshost.exe Information: 0 : SecondLevelControl_2.ArrangeOverride START
Test.vshost.exe Information: 0 : SecondLevelControl_2.ArrangeOverride END
Test.vshost.exe Information: 0 : FirstLevelControl.ArrangeOverride END
Test.vshost.exe Information: 0 : Window1.ArrangeOverride END
[...]

这表明temp = base.ArrangeOverridereturn temp之间的代码行始终在所有嵌套用户控件的ArrangeOverride方法中的所有代码之后执行。我没有尝试跟踪内置控件的Arrange的执行,但是我想它们具有相同的行为。

关于c# - ArrangeOverride调用在调用更多代码之前安排子级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4888361/

10-10 10:37