WPFの幅とActualWidthの違いは何ですか?
-
03-07-2019 - |
質問
現在、WPFで Panel
を操作していますが、 Width
および Height
プロパティに関しては、2つの ActualWidth
および ActualHeight
と呼ばれる他のプロパティ。
ActualWidth
これのレンダリングされた幅を取得します 素子。これは依存関係です プロパティ。 (から継承 FrameworkElement。)
幅
要素の幅を取得または設定します。 これは依存関係プロパティです。 (FrameworkElementから継承されます。)
参照: MSDN
誰でも 2つの違いとどちらを使用するかを指摘できますか?
解決
Width
/ Height
は、リクエストされたサイズまたはレイアウトのサイズです。 Autoに設定した場合、コードビハインドでプロパティにアクセスすると、値は double.NaN
になります。
ActualWidth
/ ActualHeight
はレンダリングされたサイズです。アイテムの実際のサイズが必要な場合は、この属性を使用します。
他のヒント
1つの要素の幅または高さを別の要素にバインドする場合、 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>
ActualWidth
は値のパディングを考慮しているため、その番号を知る必要があるときはいつでも、幅の代わりに Actualwidth
を呼び出して計算を避けることができます。
編集:マージンb / cを削除しました。これはActualWidthの一部ではありません。
ActualWidth
はレンダリングシステムによって設定され、他の要素の幅と全体的なサイズの制約によって異なる場合があります。その結果、変更することはできません。 Width
は変更可能なプロパティであり、要素の幅を増減するために使用する必要があります。
MSDN から:
このプロパティは、他の幅の入力とレイアウトシステムに基づいて計算された値です。値は、実際のレンダリングパスに基づいてレイアウトシステム自体によって設定されるため、入力変更の基になる
Width
などのプロパティの設定値よりもわずかに遅れることがあります。
ActualWidth
を使用してバインドしないという非常に正当な理由があります(明らかに ActualHeight
)。
要素の Width
を別の要素の ActualWidth
に設定すると、レイアウトチェーンを解除できます。
最良の場合、親(バインディングソース)のレイアウトプロセスが完了した後に、要素/コントロールを解析する必要があります。それは追加の時間を意味します。 親と同じ階層レベルにある場合、レイアウトプロセスは最終的なサイズを計算するために(少なくとも)2回実行する必要があります。
たとえば、 TemplatedParent
(しない)に設定するスタイルでサイズプロパティがオーバーライドされたコントロールがありました:
<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に問題があります。レイアウト実行の最終サイズを台無しにするのではなく、それをより良く修正します。
まさに、レンダリング幅!=レイアウト幅です。 1つはレイアウト用、もう1つはレンダリング用です。 WinFormsと同様に、SizeプロパティとClientSizeプロパティがあり、それらはわずかに異なります。レンダリングにはAtual / Clientサイズを使用し、レイアウトにはWidth / Heightを使用する必要があります。
Width
プロパティは設定できますが、 ActualWidth
プロパティは設定できません。
Width
プロパティを使用してパネルのレンダリング方法を決定し、 ActualWidth
を実際に使用された幅に設定します。これは、子要素のサイズと親要素からの制約に応じて、幅と同じ値ではない場合があります。
ActualWidth
は、 Width
プロパティの設定時にすぐには設定されませんが、レンダリング中に(1回以上)更新されます。