我在这样定义的Grid中有一个Canvas:

<Canvas x:Name="outerCanvas">
    <Grid Grid.Row="1" Name="cGrid" ShowGridLines="True" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}" Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition  />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Rectangle Name="rectangle1" Stroke="Black" Fill="AntiqueWhite" />
        <Rectangle Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle2" Stroke="Black" Fill="AliceBlue" />
        <Rectangle Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" Name="rectangle3" Stroke="Black" Fill="Aqua" />
        <Rectangle Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="1" Name="rectangle4" Stroke="Black" Fill="DarkViolet" />
    </Grid>
</Canvas>

我的问题是,在Window构造函数上,在InitializeComponents()之后是Grid.ColumnDefinitions[0].ActualWidth或“任何矩形”。 ActualWidth都设置为0.0(高度相同)。我没有弄清楚该怎么做才能获取此信息。有什么帮助吗?

观察结果:
  • 我没有定义外部 Canvas 的宽度和高度,但是如果定义,则不能解决我的问题。
  • 在运行时,我可以看到此Canvas/Grid占据了整个窗口空间,因此其内部的每个矩形都有ActualWidthActualHeight
  • 网格的宽度/高度绑定(bind)到 Canvas ,但我尝试删除此绑定(bind),但问题仍然存在。
  • 最佳答案

    直到测量并布置控件后,才能设置ActualHeightActualWidth。通常,InitializeComponent()中没有任何可导致测量的内容,因此当它返回时,它们仍为零。

    您可以通过在窗口的Measure()返回之后手动调用窗口的Arrange()InitializeComponent()方法来强制更早地计算它们。

    如果要调整内容大小:

    window.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height));
    

    如果使用显式窗口大小:
    window.Measure(new Size(Width, Height));
    window.Arrange(new Rect(0, 0, window.DesiredSize.Width, window.DesiredSize.Height));
    

    09-25 18:04