Wpf 如果我不调用UpdateLayout(),则LayoutInformation.GetLayoutSlot(Panel).Width可能返回0

Wpf 如果我不调用UpdateLayout(),则LayoutInformation.GetLayoutSlot(Panel).Width可能返回0,wpf,Wpf,打开新面板时,会在某个点引发其加载的事件。在这里,我试着打电话 LayoutInformation.GetLayoutSlot( Parent as Panel ).Width 根据加载的事件是一个先决条件,以便计算布局等,但我已满足该条件。N.b.Loaded从根目录调用到子目录 我尝试手动调用执行此任务的UpdateLayout(),但仍然不明白它为什么不能单独工作 有人有什么线索吗 注意,当我对我父母的父母调用该方法时,它似乎起了作用 更新 我使用的面板设置了一些宽度和高度。然后,我打开

打开新面板时,会在某个点引发其加载的事件。在这里,我试着打电话

LayoutInformation.GetLayoutSlot( Parent as Panel ).Width
根据加载的事件是一个先决条件,以便计算布局等,但我已满足该条件。N.b.Loaded从根目录调用到子目录

我尝试手动调用执行此任务的
UpdateLayout()
,但仍然不明白它为什么不能单独工作

有人有什么线索吗

注意,当我对我父母的父母调用该方法时,它似乎起了作用

更新 我使用的面板设置了一些宽度和高度。然后,我打开并创建一个具有面板的新画布。我希望最内部的面板能够拉伸可用空间-有时我得到一个合适的值,有时则没有。 我只是想理解为什么它不一致,它似乎是在大量处理过程中发生的。

阅读该事件时,我注意到以下片段:

如果处理程序重置布局系统解释为需要新布局过程的任何属性,请小心重入。(如果不确定哪些属性在更改时需要新的布局过程,则可能需要检查属性上的FrameworkPropertyMetadata值。)

我的猜测是,可能您是,或者是一个子控件,或者类似的东西,一旦绑定连接起来并且属性发生更改,就需要一个新的布局过程。话虽如此,这听起来像是常见的行为,最好的办法是调用
UpdateLayout()
,以确保控件大小正确。我遇到了可能有用的问题

另外,请注意:

<Grid Width="0">
    <Canvas x:Name="Parent"
            Background="Red"
            Width="10"
            Loaded="Parent_Loaded">
        <Canvas x:Name="Child"
                Background="Yellow"
                Width="20"
                Height="20"
                Loaded="Child_Loaded" />
    </Canvas>
</Grid>


调用
LayoutInformation.GetLayoutSlot(父面板)。宽度将返回0,尽管所有对象都将出现。但是,如果将父级
Canvas
改为
StackPanel
,则不会显示任何内容。这表明
Canvas
具有特殊的布局逻辑(它不继承布局属性)。这就是为什么显示更多XAML可以帮助我们确定更明确的解决方案。

我不介意看到更多的代码。我正在尝试重新创建此项,但无法使其返回0。你能提供一个可视化的树吗?我试着在画布里面放一块画布。嘿,我不使用画布,但是如果它能帮助重新制作,我很好。我将尝试元数据值。我阅读了之前的布局和关于测量超越等。到目前为止!Ps更新了我的问题。哦,对不起,中间的面板是画布:/n我没有意识到这一点