45

私は次のように定義された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>

私の問題は、ウィンドウコンストラクターで、InitializeComponents()またはGrid.ColumnDefinitions[0].ActualWidth「任意の長方形」の後にあることです。ActualWidthはすべて 0.0 に設定されています (高さについても同じです)。この情報を取得するために何をすべきかわかりません。何か助けはありますか?

所見:

  1. 外側のキャンバスの幅と高さを定義していませんが、そうしても問題は解決しません。
  2. Canvas/Grid実行時に、これがウィンドウ スペース全体を占有していることがわかるので、その中のすべての長方形にはActualWidths とActualHeightsがあります
  3. グリッドの幅/高さはキャンバスにバインドされていますが、このバインドを削除しようとしましたが、問題は解決しません。
4

3 に答える 3

82

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));
于 2009-11-08T05:53:05.710 に答える
69

レイは正しい(+1)。これは、メジャーパスとアレンジパスがまだ実行されていないためです。ただし、別のレイアウトパス(高価)を強制するのではなく、コントロールが読み込まれるまで待ってから、ActualXxxプロパティにアクセスできます。

public MyWindow()
{
    Loaded += delegate
    {
        // access ActualWidth and ActualHeight here
    };

}
于 2009-11-08T09:04:43.417 に答える