現在、WPFでPanel
sを使用していますが、Width
プロパティとHeight
プロパティに関して、ActualWidth
と呼ばれる他の2つのプロパティもあります。 ActualHeight
。
ActualWidth
この要素のレンダリングされた幅を取得します。これは依存関係プロパティです。 (FrameworkElementから継承されます。)
Width
要素の幅を取得または設定します。これは依存関係プロパティです。 (FrameworkElementから継承されます。)
参照: [〜#〜] msdn [〜#〜]
誰でも2つといつどちらを使用するかの違いを指摘できますか?
Width
/Height
は 要求またはレイアウト サイズ。 Autoに設定した場合、値はdouble.NaN
コードビハインドでプロパティにアクセスするとき。
ActualWidth
/ActualHeight
は レンダリングされた サイズ。アイテムの実際のサイズが必要な場合は、この属性を使用します。
ある要素の幅または高さを別の要素にバインドする場合、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
に設定するスタイルでオーバーライドするコントロールがありました(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に何か問題があります。レイアウト実行の最終サイズを台無しにするのではなく、それをより良く修正します。
まさに、レンダリング幅!=レイアウト幅です。 1つはレイアウト用、もう1つはレンダリング用です。 WinFormsと同様に、SizeプロパティとClientSizeプロパティがあり、それらはわずかに異なります。レンダリングにはAtual/Clientサイズを使用し、レイアウトにはWidth/Heightを使用する必要があります。
Width
プロパティは設定できますが、ActualWidth
プロパティは設定できません。
Width
プロパティは、パネルのレンダリング方法を決定するために使用され、ActualWidth
は使用された実際の幅に設定されます。これは、子要素のサイズと親要素からの制約に応じて、幅と同じ値ではない場合があります。
ActualWidth
は、Width
プロパティの設定時にすぐには設定されませんが、レンダリング中に(1回以上)更新されます。