你可以叫你的自定义代码后,你的窗口的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方法中的所有代码之后执行。我没有试图追踪内置控件排列的执行情况,但我想他们具有相同的行为。
当然,这不是ArrangeOverride方法的通用实现,任何额外的logi都可以在调用base.ArrangeOverride之前进行。这个例子只是为了显示在所有内容的ArrangeOverride方法执行后将把代码放在哪里执行,正如问。 – BertuPG 2011-02-08 10:01:14