您可以在窗口的 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.ArrangeOverride 和return temp 之间的代码行总是在所有嵌套用户控件的ArrangeOverride 方法中的所有代码之后执行。我没有尝试跟踪内置控件的排列的执行,但我想它们具有相同的行为。