在调用更多代码之前,ArrangeOverride调用安排子项

Xen*_*eno 6 c# wpf layout

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

所以我有一个带有自定义ItemsControl的WPF窗口,其Items面板是一个自定义Panel,每个ItemContainer都是一个自定义元素.

当窗口调用InvalidateArrange()时,ArrangeOverride()调用的顺序似乎没问题,即

Window -> List -> ItemsPanel -> ItemContainer -> ItemContainer -> etc...
Run Code Online (Sandbox Code Playgroud)

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

有没有办法测量所有的窗口子项,然后返回到Windows ArrangeOverride()继续一些代码,或者是否有事件要挂钩或什么?

干杯

Ber*_*uPG 3

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

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

        // custom code goes here!

        return temp;
    }
Run Code Online (Sandbox Code Playgroud)

(我刚刚测试过,它有效:自定义代码在窗口中任何子控件的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;
}
[...]
Run Code Online (Sandbox Code Playgroud)

在 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;
}
[...]
Run Code Online (Sandbox Code Playgroud)

在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>
[...]
Run Code Online (Sandbox Code Playgroud)

最后是执行后的输出:

[...]
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
[...]
Run Code Online (Sandbox Code Playgroud)

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