web-dev-qa-db-ja.com

WPFの幅とActualWidthの違いは何ですか?

現在、WPFでPanelsを使用していますが、WidthプロパティとHeightプロパティに関して、ActualWidthと呼ばれる他の2つのプロパティもあります。 ActualHeight

ActualWidth

この要素のレンダリングされた幅を取得します。これは依存関係プロパティです。 (FrameworkElementから継承されます。)

Width

要素の幅を取得または設定します。これは依存関係プロパティです。 (FrameworkElementから継承されます。)

参照: [〜#〜] msdn [〜#〜]

誰でも2つといつどちらを使用するかの違いを指摘できますか

46
Andreas Grech

Width/Heightは 要求またはレイアウト サイズ。 Autoに設定した場合、値はdouble.NaNコードビハインドでプロパティにアクセスするとき。

ActualWidth/ActualHeightは レンダリングされた サイズ。アイテムの実際のサイズが必要な場合は、この属性を使用します。

69
Muad'Dib

ある要素の幅または高さを別の要素にバインドする場合、ActualWidthが最も役立ちます。

この簡単な例では、2つのボタンが並んで配置され、その下に2つのボタンを含むStackPanelの幅に制限されたコメントがあります。

<StackPanel>

    <StackPanel Margin="0,12,0,0" Orientation="Horizontal" Name="buttonPanel" HorizontalAlignment="Left" >
         <Button Content="Yes - Arm the missile" FontWeight="Bold" HorizontalAlignment="Left"/>
         <Button Content="No - Save the world" HorizontalAlignment="Left" Margin="7,0,0,0"/>
    </StackPanel>

    <TextBlock Text="Please choose whether you want to arm the missile and kill everybody, or save the world by deactivating the missile." 
               Width="{Binding Path=ActualWidth,ElementName=buttonPanel}" Margin="0,5,0,0" HorizontalAlignment="Left" TextWrapping="Wrap"/>

</StackPanel>
9
Simon_Weaver

ActualWidthは値のパディングを考慮しているため、その番号を知る必要があるときはいつでも、幅の代わりにActualwidthを呼び出して計算を避けることができます。

編集:マージンb/cを削除しました。これはActualWidthの一部ではありません。

6
TWood

ActualWidthはレンダリングシステムによって設定され、他の要素の幅と全体的なサイズの制約によって異なる場合があります。その結果、変更することはできません。 Widthは変更可能なプロパティであり、要素の幅を増減するために使用する必要があります。

[〜#〜] msdn [〜#〜] から:

このプロパティは、他の幅の入力とレイアウトシステムに基づいて計算された値です。値は、実際のレンダリングパスに基づいてレイアウトシステム自体によって設定されるため、入力変更の基になるWidthなどのプロパティの設定値よりもわずかに遅れることがあります。

3
Andy Mikula

非常に正当な理由がありますActualWidthを使用しない(明らかにActualHeightに応じて)にバインドします。要素のWidthを別の要素のActualWidthに設定すると、レイアウトチェーンを破るになります。

最良の場合、親(バインディングソース)のレイアウトプロセスが完了した後に、要素/コントロールを解析する必要があります。それは追加の時間を意味します。親と同じ階層レベルにある場合、レイアウトプロセスは最終的なサイズを計算するために(少なくとも)2回実行する必要があります。

たとえば、サイズプロパティをTemplatedParentに設定するスタイルでオーバーライドするコントロールがありました(do n't do)

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}" 
           Height="1" Fill="#000000"/>

含まれているウィンドウのサイズを変更するとき、コントロールはコンテナが小さくなるのを防ぎ、レイアウトを制動します。 Widthに設定すると、問題が解決します(do)

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}" 
           Height="1" Fill="#000000"/>

一般にActualWidthを使用する必要がある場合、xamlに何か問題があります。レイアウト実行の最終サイズを台無しにするのではなく、それをより良く修正します。

2
Pascal

まさに、レンダリング幅!=レイアウト幅です。 1つはレイアウト用、もう1つはレンダリング用です。 WinFormsと同様に、SizeプロパティとClientSizeプロパティがあり、それらはわずかに異なります。レンダリングにはAtual/Clientサイズを使用し、レイアウトにはWidth/Heightを使用する必要があります。

0
John Leidegren

Widthプロパティは設定できますが、ActualWidthプロパティは設定できません。

Widthプロパティは、パネルのレンダリング方法を決定するために使用され、ActualWidthは使用された実際の幅に設定されます。これは、子要素のサイズと親要素からの制約に応じて、幅と同じ値ではない場合があります。

ActualWidthは、Widthプロパティの設定時にすぐには設定されませんが、レンダリング中に(1回以上)更新されます。

0
Guffa