FrameworkElement.MeasureOverride(Size) メソッド

定義

レイアウト サイクルの "メジャー" パスの動作を提供します。 クラスは、このメソッドをオーバーライドして、独自の "Measure" パス動作を定義できます。

protected:
 virtual Size MeasureOverride(Size availableSize) = MeasureOverride;
Size MeasureOverride(Size const& availableSize);
protected virtual Size MeasureOverride(Size availableSize);
function measureOverride(availableSize)
Protected Overridable Function MeasureOverride (availableSize As Size) As Size

パラメーター

availableSize
Size

このオブジェクトが子オブジェクトに提供できるサイズ。 無限大は、オブジェクトが使用可能なコンテンツに合ったサイズになることを示す値として指定できます。

戻り値

子オブジェクトに割り当てられたサイズの計算、または固定コンテナー サイズなどの他の考慮事項に基づいて、レイアウト中にこのオブジェクトが必要と判断するサイズ。

この例では、MeasureOverride を実装して、カスタム パネル実装の "Measure" パス ロジックをカスタマイズします。 特に、コードの次の側面に注意してください。

  • 子を反復処理します。
  • 子ごとに、パネル ロジックが子の数と独自の既知のサイズ制限をどのように扱うかに基づいて、Size を使用して Measure を呼び出します。
  • そのサイズを返します (この場合、この単純なパネルは、測定値の累積で計算されたサイズではなく、固定サイズを返します)。
// First measure all children and return available size of panel
protected override Size MeasureOverride(Size availableSize)
{

    // Measure first 9 children giving them space up to 100x100, remaining children get 0x0 
    int i = 0;
    foreach (FrameworkElement child in Children)
    {
        if (i < 9)
        {
            child.Measure(new Size(100, 100));
        }
        else
        {
            child.Measure(new Size(0, 0));
        }

        i++;
    }


    // return the size available to the whole panel, which is 300x300
    return new Size(300, 300);
}
'First measure all children and return available size of panel 
Protected Overrides Function MeasureOverride(ByVal availableSize As Size) As Size
    'Measure first 9 children giving them space up to 100x100, remaining children get 0x0 
    Dim i As Integer = 0
    For Each child As FrameworkElement In Children
        If i < 9 Then
            child.Measure(New Size(100, 100))
        Else
            child.Measure(New Size(0, 0))
        End If
        i += 1
    Next
    'return the size available to the whole panel, which is 300x300 
    Return New Size(300, 300)
End Function

注釈

このメソッドには、ほとんどの FrameworkElement 派生クラスに対して組み込みのレイアウトを実行する既定の実装があります。 MeasureOverride は、 内部レイアウト ロジックまたは独自のアプリのコード (他のクラス用の独自の MeasureOverride メソッドを含む) によって Measure が呼び出されるたびに、Measure の動作を提供します。 テンプレート化されたコントロールを生成する場合、MeasureOverride ロジックによって、コントロール固有の "Measure" パス レイアウト ロジックが定義されます。

アプリの実行時に要素がレイアウト プロセスを通過する方法の一般的な設計は、"メジャー" パスと "配置" パスの 2 つの手順に分かれています。 レイアウト処理の "メジャー" パスをカスタマイズするコントロール作成者 (またはパネル作成者) は、MeasureOverride をオーバーライドする必要があります。 実装では、次の操作を行う必要があります。

  • レイアウトの一部である子オブジェクトのクラスの特定のコレクションを反復処理し、各子オブジェクトに 対して Measure を呼び出します。
  • 各子に 対して DesiredSize をすぐに取得します ( これは Measure が呼び出された後にプロパティとして設定されます)。
  • 子オブジェクトに必要なサイズの実行中の測定に基づいて、親の必要なサイズを計算します。 MeasureOverride の戻り値は、オブジェクト独自の目的のサイズである必要があります。これにより、現在のオブジェクトの親の Measure 入力になります。 この同じプロセスは、ページ/オブジェクト ツリーのルートに到達するまで、レイアウト システムを通じて続行されます。 このプロセス中に、子オブジェクトは初期 availableSize よりも大きな DesiredSize サイズを返して、子オブジェクトがより多くの領域を必要とすることを示す場合があります。 これは、スクロール可能な領域の導入、親コントロールのサイズ変更、何らかの積み上げ順序の確立、またはレイアウト コンテナーの目的の機能に応じて異なる可能性のあるコンテンツを測定または配置するための任意の数のソリューションによって、独自の実装で処理される場合があります。

適用対象

こちらもご覧ください