Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ArrangeOverride调用在调用更多代码之前安排子项_C#_Wpf_Layout - Fatal编程技术网

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

C# ArrangeOverride调用在调用更多代码之前安排子项,c#,wpf,layout,C#,Wpf,Layout,好的,就在我认为我已经弄清楚了布局系统的时候,我撞到了一堵砖墙 因此,我有一个带有自定义ItemsControl的WPF窗口,其中的Items面板是一个自定义面板,每个ItemContainer都是一个自定义元素 当窗口调用InvalidateArrange()时,ArrangeOverride()调用的顺序似乎很好,即 Window -> List -> ItemsPanel -> ItemContainer -> ItemContainer -> etc...

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

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

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

Window -> List -> ItemsPanel -> ItemContainer -> ItemContainer -> etc...
问题是,在ArrangeOverride依赖于所有ItemContainer的排列和大小之后,我有一些代码要在窗口级别调用。窗口级别的ArrangeOverride()在树中的下一项(列表)调用其ArrangeOverride之前结束

是否有方法测量所有windows子项,然后返回windows ArrangeOverride()继续执行某些代码,或者是否有要挂接的事件或其他内容


干杯

在窗口的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>
[...]

这表明
temp=base.ArrangeOverride
return temp
之间的代码行始终在所有嵌套用户控件的ArrangeOverride方法中的所有代码之后执行。我没有尝试跟踪内置控件Arrange的执行情况,但我认为它们具有相同的行为。

当然,这不是ArrangeOverride方法的一般实现,任何额外的登录都可以在调用base.ArrangeOverride之前进行。这个例子只是为了显示在所有内容的ArrangeOverride方法被执行后,代码将被执行到什么地方,就像被问到的那样。如果我在base.ArrangeOverride调用上设置断点,则子对象ArrangeOverride和父对象ArrangeOverride函数中的返回临时值将在子对象点击其ArrangeOverride之前返回。@Xeno:我添加了更详细的示例,以及输出结果。如果您仍然发现问题,请告诉我!;)好的,您的解决方案在给出的示例中确实有效,但我的代码似乎不起作用,我想我知道原因。在检查WPF属性时,没有一个ItemContainers具有父级(位于null处),ItemsPanel也没有。列表知道窗口是父窗口,但其他列表都不知道。知道为什么通过自定义ItemsPanel添加到ItemsControl的项没有父项吗?@Xeno:我想最后一个问题是另一个问题。无论如何,如果你发布一些代码的摘录会更好。
[...]
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
[...]