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

时间:2014-07-08 15:13:54

标签: wpf

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

LayoutInformation.GetLayoutSlot( Parent as Panel ).Width

根据some guy,Loaded事件是先决条件,以便计算布局等,但我已经满足了这个条件。注:从根到孩子们被称为加载。

我尝试手动调用UpdateLayout()来完成这项工作,但我仍然不明白为什么它本身不起作用。

有没有人有任何线索?

N.b。当我在父母的父母身上调用这个方法时,它似乎有效!

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

1 个答案:

答案 0 :(得分:0)

阅读FrameworkElement.Loaded事件,我注意到了这个片段:

  

如果处理程序重置布局系统解释的任何属性以表示需要新的布局传递,请注意重入。 (如果您不确定哪些属性在更改后可能需要新的布局传递,则可能需要检查属性上的FrameworkPropertyMetadata值。)

我的猜测是,或许是一个儿童控制,或者某种性质的东西需要一个新的布局传递一旦绑定和属性变化。话虽这么说,这听起来像通常的行为,你最好的办法是调用UpdateLayout()来确保控件的大小正确。我遇到了可能有用的Layout

另外,请注意:

<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(Parent as Panel).Width;将返回0,但会显示所有对象。但是,如果您将父Canvas改为StackPanel,则您不会看到任何内容。这表明Canvas具有特殊的布局逻辑(它不会继承布局属性)。这就是为什么显示更多XAML可能有助于我们确定更明确的解决方案。