このドキュメントはアーカイブされており、メンテナンスされていません。

FrameworkElement.MeasureOverride メソッド

更新 : 2007 年 11 月

派生クラスでオーバーライドされると、子要素に必要なレイアウトのサイズを測定し、FrameworkElement 派生クラスのサイズを決定します。

名前空間 :  System.Windows
アセンブリ :  PresentationFramework (PresentationFramework.dll 内)

protected virtual Size MeasureOverride(
	Size availableSize
)
protected Size MeasureOverride(
	Size availableSize
)
protected function MeasureOverride(
	availableSize : Size
) : Size
メソッドは XAML では使用できません。

パラメータ

availableSize
型 : System.Windows.Size

この要素が子要素に与えることができる使用可能なサイズ。値として無限大を指定し、この要素があらゆるコンテンツにサイズを合わせられるようにすることができます。

戻り値

型 : System.Windows.Size

子要素のサイズの計算に基づいてこの要素でレイアウト時に必要と判断されたサイズ。

要素の Windows Presentation Foundation (WPF) レイアウト システムでのカスタム レイアウト サイズ変更動作を実装するには、MeasureOverride をオーバーライドします。実装では次の処理を行う必要があります。

  1. 要素のレイアウトの一部となっている子の特定のコレクションを反復処理して、各子要素で Measure を呼び出します。

  2. そのまま子の DesiredSize を取得します (この値は Measure の呼び出し後にプロパティとして設定されます)。

  3. 子要素の測定に基づいて親の最終的な必要サイズを計算します。

MeasureOverride の戻り値は要素自身の必要サイズであり、この値がさらに、現在の要素の親要素の測定の入力になります。ページのルート要素に到達するまでこの同じプロセスがレイアウト システムで繰り返されます。

このプロセスの間に、最初の availableSize より大きなサイズの DesiredSize が子要素から返される場合があります。これは、その子要素により多くの領域が必要であることを示します。この場合は、スクロール可能な領域を導入する、親コントロールのサイズを変更する、何らかのスタック順序を確立するなど、コンテンツの測定や配置のためのあらゆる方法を使用して対処することができます。

重要 :

要素では、このプロセスの間に各子要素で Measure を呼び出す必要があります。各子要素で呼び出さないと、子要素のサイズ設定や配置は行われません。

継承元へのメモ :

次のコンパイルされないコードは、この実装パターンを示しています。VisualChildren は、実際の要素で定義する必要がある子の列挙可能なコレクションのプロパティを表しています。このプロパティの名前は自由に指定できます。VisualChildren はこの例のためのプレースホルダ名であり、WPF によって提供される API や名前付けパターンの一部ではありません。

protected override Size MeasureOverride(Size availableSize)
{
    Size desiredSize = new Size();
    foreach (UIElement child in VisualChildren)
    {
        child.Measure(availableSize);
        // do something with child.DesiredSize, either sum them directly or apply whatever logic your element has for reinterpreting the child sizes
        // if greater than availableSize, must decide what to do and which size to return
    }
    // desiredSize = ... computed sum of children's DesiredSize ...;
    // IMPORTANT: do not allow PositiveInfinity to be returned, that will raise an exception in the caller!
    // PositiveInfinity might be an availableSize input; this means that the parent does not care about sizing
    return desiredSize;
}


この例では、Panel 要素の既定のレイアウト動作をオーバーライドして、Panel から派生したカスタム レイアウト要素を作成する方法を示します。

この例では、PlotPanel という単純なカスタム Panel 要素を定義します。この要素は、ハードコーディングされた x 座標および y 座標に従って子要素を配置します。この例では、x および y をどちらも 50 に設定します。そのため、すべての子要素は x 座標および y 座標上のこの位置に配置されます。

カスタムの Panel 動作を実装するために、この例では MeasureOverride メソッドと ArrangeOverride メソッドを使用します。各メソッドは、子要素の配置とレンダリングに必要な Size データを返します。

public class PlotPanel : Panel
{
    // Default public constructor
    public PlotPanel()
        : base()
    {
    }

    // Override the default Measure method of Panel
    protected override Size MeasureOverride(Size availableSize)
    {
        Size panelDesiredSize = new Size();

        // In our example, we just have one child. 
        // Report that our panel requires just the size of its only child.
        foreach (UIElement child in InternalChildren)
        {
            child.Measure(availableSize);
            panelDesiredSize = child.DesiredSize;
        }

        return panelDesiredSize ;
    }
    protected override Size ArrangeOverride(Size finalSize)
    {
        foreach (UIElement child in InternalChildren)
        {
            double x = 50;
            double y = 50;

            child.Arrange(new Rect(new Point(x, y), child.DesiredSize));
        }
        return finalSize; // Returns the final Arranged size
    }
}


サンプル全体については、「簡単なカスタム パネルの作成のサンプル」を参照してください。

Windows Vista

.NET Framework および .NET Compact Framework では、各プラットフォームのすべてのバージョンはサポートしていません。サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。

.NET Framework

サポート対象 : 3.5、3.0
表示: