2011-02-03 42 views
6

好了,就在我以为我有布局系统想通了,我撞了南墙才安排子女...ArrangeOverride调用调用更多的代码

所以我有一个WPF窗口自定义的ItemsControl,该项目其中的面板是自定义面板,每个ItemContainer都是自定义元素。

当窗口InvalidateArrange()调用,在ArrangeOverride(顺序)调用,似乎要被罚款,即

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

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

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

干杯

回答

2

你可以叫你的自定义代码后,你的窗口的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方法中的所有代码之后执行。我没有试图追踪内置控件排列的执行情况,但我想他们具有相同的行为。

+0

当然,这不是ArrangeOverride方法的通用实现,任何额外的logi都可以在调用base.ArrangeOverride之前进行。这个例子只是为了显示在所有内容的ArrangeOverride方法执行后将把代码放在哪里执行,正如问。 – BertuPG 2011-02-08 10:01:14