質問

現在、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回以上)更新されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top