gpt4 book ai didi

c# - ArrangeOverride 在调用更多代码之前调用安排子项

转载 作者:太空狗 更新时间:2023-10-29 21:55:42 25 4
gpt4 key购买 nike

好吧,就在我认为我已经弄清楚了布局系统时,我碰壁了......

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

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

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

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

有没有一种方法可以测量所有 Windows 子级,然后返回到 Windows ArrangeOverride() 以继续执行某些代码,或者是否有一个事件可以 Hook 或什么?

干杯

最佳答案

您可以在窗口的 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 方法中的所有代码之后执行。我没有尝试跟踪内置控件 Arrange 的执行,但我想它们具有相同的行为。

关于c# - ArrangeOverride 在调用更多代码之前调用安排子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4888361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com