首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ArrangeOverride在调用更多代码之前调用排列子对象

ArrangeOverride在调用更多代码之前调用排列子对象
EN

Stack Overflow用户
提问于 2011-02-03 23:54:11
回答 1查看 1.9K关注 0票数 6

好的,就在我以为我已经弄清楚布局系统的时候,我撞到了砖墙……

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

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

代码语言:javascript
复制
Window -> List -> ItemsPanel -> ItemContainer -> ItemContainer -> etc...

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

有没有一种方法可以测量所有的Windows子窗口,然后返回到windows ArrangeOverride()继续执行一些代码,或者是否有可以挂钩的事件或其他东西?

干杯

EN

回答 1

Stack Overflow用户

发布于 2011-02-07 23:34:05

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

代码语言:javascript
复制
    protected override Size ArrangeOverride(Size arrangeBounds)
    {
        Size temp = base.ArrangeOverride(arrangeBounds);

        // custom code goes here!

        return temp;
    }

(我刚才测试了一下,运行正常:自定义代码在窗口中任何子控件的ArrangeOverride之后执行)

编辑:遵循一个经过测试并正常工作的示例:

在window1.xaml.cs中:

代码语言:javascript
复制
[...]
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中:

代码语言:javascript
复制
[...]
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中:

代码语言:javascript
复制
[...]
<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>
[...]

最后,执行后的输出:

代码语言:javascript
复制
[...]
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方法中的所有代码之后执行。我没有尝试跟踪内置控件的排列的执行情况,但我认为它们具有相同的行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4888361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档