2011-06-19 33 views
21

私はすべての項目の高さを知りたい私のStackPanelStackpanel:高さ対ActualHeight対ExtentHeight対ViewportHeight対DesiredSize対RenderSize

の違いは何ですか:

  • Heightは - 要素の高さの推奨を取得または設定します。
  • ActualHeight - この要素のレンダリングされた高さを取得します。 (readonly
  • ExtentHeight - エクステントの垂直サイズを含む値を取得します。 (readonly
  • ViewportHeight - コンテンツのビューポートの垂直サイズを含む値を取得します。 (readonly
  • DesiredSize - レイアウトプロセスの計測パスでこの要素が計算したサイズを取得します。 (readonly
  • RenderSize - この要素の最終的なレンダリングサイズを取得します(または設定しますが、注釈を参照してください)。 MSDNから

Height
要素の提案の高さを取得または設定します。

プロパティ値:Double - 要素の高さで、デバイスに依存しない単位(1/96thインチ/単位)です。

要素の高さは、デバイスに依存しない単位(単位1/96thインチ)です。

 

ActualHeight読み取り専用
この要素の描画時の高さを取得します。

プロパティ値:Double - 要素の高さ。デバイスに依存しない単位(1/96thインチ/単位)の値です。

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

ActualHeightは計算された値なので、レイアウトシステムによるさまざまな操作の結果として、複数のまたは増分の変更が報告される可能性があることに注意してください。レイアウトシステムは、子要素に対する必要な測定空間、親要素による制約などを計算することができる。

 

ExtentHeight読み取り専用
エクステントの縦方向のサイズが含まれている値を取得します。

プロパティの高さ:Double - エクステントの垂直サイズを表すDouble。

返される値は、デバイス非依存ピクセルで記述されています。

 

ViewportHeight読み取り専用
コンテンツのビューポートの縦方向のサイズが含まれている値を取得します。

プロパティ値:Double - コンテンツのビューポートの垂直サイズを表すDoubleです。

返される値は、デバイス非依存ピクセルで記述されています。

 

DesiredSize読み取り専用
この要素は、レイアウト処理の測定パスの実行中に計算サイズを取得します。

プロパティ値:Size - 計算されたサイズで、アレンジ・パスの望ましいサイズになります。

このプロパティによって返される値は、IsMeasureValidプロパティの値がtrueの場合にのみ有効です。

通常、DesiredSizeは、ArrangeOverride、MeasureOverride、またはOnRenderなどのレイアウトビヘイビアのオーバーライドを実装するときの測定要素の1つとしてチェックされます(OnRenderの場合、RenderSizeをチェックするかもしれませんが、これは実装によって異なります)。シナリオによっては、実装されたロジックによってDesiredSizeが完全に尊重され、DesiredSizeの制約が適用され、そのような制約によって親要素または子要素の他の特性も変更される可能性があります。たとえば、スクロール可能な領域をサポートするコントロール(ただし、スクロール可能な領域を既に有効にしているWPFフレームワークレベルのコントロールから派生しないことを選択)は、使用可能なサイズをDesiredSizeと比較できます。コントロールは、そのコントロールのUIのスクロールバーを有効にした内部状態を設定できます。また、特定のシナリオでDesiredSizeを無視することも可能です。  

RenderSize

は、この要素の最終的な描画サイズを取得します。

プロパティ値:Size - この要素のレンダリングサイズ。

このプロパティは、OnRenderやGetLayoutClipなどのレイアウトシステムオーバーライド内の適用可能なレンダーサイズをチェックするために使用できます。

もっと一般的なシナリオは、クラスハンドラのオーバーライドまたはOnRenderSizeChangedイベントでSizeChangedイベントを処理する場合です。私の場合は


iはStackPanel内のすべての項目の希望の高さを知ってほしいです。言い換えれば

:私は(描画前)のStackPanelのすべての項目の高さを知ってほしい、と彼らはパネルをオーバーフローした場合、私は

  • 規模を縮小
  • を削除します
  • は、彼らがのStackPanelに収まることを確認するために

項目を調整します。私はおそらくサイズを変更イベント(?SizeChangedLayoutUpdated)中に希望高さ(?ExtentHeight DesiredSizeを)を取得したい意味

- 任意の描画が発生する前には、(それは高速です)。

これらのプロパティのほとんどはゼロを返します。これらのプロパティが何を意味しているのか分かりませんが、ドキュメントには説明されていません。

答えて

14

ご存知のように、StackPanelは[Panel]オブジェクトです。各パネルは、最終的なサイズと位置を決定するために2つの方法で子供と通信します。 最初の方法はMeasureOverrideで、第2の方法はArrangeOverrideです。

MeasureOverideは、各子供に所定の容量のスペースを使用して希望のサイズを尋ねます。 ArrangeOverrideは、測定が完了した後に子供を配置します。

public class AnotherStackPanel : Panel 
{ 
    public static readonly DependencyProperty OrientationProperty = 
     DependencyProperty.Register(“Orientation”, typeof(Orientation), 
     typeof(SimpleStackPanel), new FrameworkPropertyMetadata(
     Orientation.Vertical, FrameworkPropertyMetadataOptions.AffectsMeasure)); 

    public Orientation Orientation 
    { 
     get { return (Orientation)GetValue(OrientationProperty); } 
     set { SetValue(OrientationProperty, value); } 
    } 

    protected override Size MeasureOverride(Size availableSize) 
    { 
     Size desiredSize = new Size(); 

     if (Orientation == Orientation.Vertical) 
      availableSize.Height = Double.PositiveInfinity; 
     else 
      availableSize.Width = Double.PositiveInfinity; 
     foreach (UIElement child in this.Children) 
     { 
      if (child != null) 
      { 
       child.Measure(availableSize); 

       if (Orientation == Orientation.Vertical) 
       { 
        desiredSize.Width = Math.Max(desiredSize.Width, 
        child.DesiredSize.Width); 
        desiredSize.Height += child.DesiredSize.Height; 
       } 
       else 
       { 
        desiredSize.Height = Math.Max(desiredSize.Height, 
        child.DesiredSize.Height); 
        desiredSize.Width += child.DesiredSize.Width; 
       } 
      } 
     } 
     return desiredSize; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     double offset = 0; 
     foreach (UIElement child in this.Children) 
     { 
      if (child != null) 
      { 
       if (Orientation == Orientation.Vertical) 
       {    
        child.Arrange(new Rect(0, offset, finalSize.Width, 
        child.DesiredSize.Height));     
        offset += child.DesiredSize.Height; 
       } 
       else 
       {     
        child.Arrange(new Rect(offset, 0, child.DesiredSize.Width, 
        finalSize.Height)); 
        offset += child.DesiredSize.Width; 
       } 
      } 
     } 
     return finalSize; 
    } 
} 
  • DesiredSizeMeasureOverrideによって返されたサイズ )は のStackPanelの方向とで最大 子の大きさで、子供サイズの合計 です:

    のはのStackPanelを作成してみましょう。他の方向。レイアウト が完了した後

  • RenderSizeStackPanelの最終 サイズを表します。

  • ActualHeightは、 RenderSize.Heightとまったく同じです。

これらのプロパティを使用する場合は、LayoutUpdatedイベントのイベントハンドラ内でのみアクセスする必要があります。 ViewPortHeightlook here

  • ため

  • 3

    ためRenderSizeとActualHeightが一時的に異なる値を持つことができることを除いて、正しいです。 RenderSizeはOnRenderの前に設定されますが、WPFがそのコントロールのレイアウトとレンダリング処理を終了すると、ActualHeightが設定されます。最後に、LayoutUpdatedが呼び出されます。

    したがって、RenderSizeはOnRender内で使用できますが、ActualHeightはレイアウトを開始する前の古い値を保持します。

    シーケンスは次のようになります。

    MeasureOverride() => sets DesiredSize 
    ArrangeOverride() => sets RenderSize 
    OnRender() 
    

    WPFは、このシーケンスに数回(再​​帰)を実行することがあります。すべてが確定したら、以下のことが実行されます:(!)

    ActualHeight = RenderSize.Height 
    

    ActualHeightは手配し、レンダリング、対策のレイアウト処理自体の間を除き、行われている最初のレイアウトが完了した後、いつでもアクセスすることができます。 WPFは、レイアウト処理が実行される前にコードが完成することを保証します。

    関連する問題