2

レイアウト エンジンの背後にあるメカニズムを理解しようとして、MSDNでFrameworkElement.MesureOverrideを調べていました。私はこの興味深いメモに出くわしました:

このプロセス中に、子要素が初期の availableSize よりも大きな DesiredSize サイズを返し、子要素がより多くのスペースを必要としていることを示す場合があります。

Ok。リフレクターが近くにあったので、MesureOverride を呼び出す MesureCore を調べたところ、理解できることから、MesureOverride の戻り値は常に 0 と availableSize の間に制限されていることに気付きました。それでどうしたの?

4

2 に答える 2

1

子要素は、より多くのスペースを要求できます。それが親要素によって尊重されるかどうかは、親要素次第です。

MeasureCore は で MeasureOverride のみを呼び出しますthis。あなたは物語のごく一部しか理解していません。レイアウト システムは、要素のツリーのMeasure最上位を呼び出すことから始まります。これは、 onを呼び出します。ただし、いくつかの場所で呼び出し中です。PanelMeasureCorethisMeasureCoreFrameworkElementMeasureOverride

0 と availableSize の間の上限をどこで見ていますか?

編集: Re:「まあ、MeasureCoreの最後の行...」

私が言ったように、あなたは起こっていることすべての小さな部分を見ています.

  1. すべてのコントロールには、実際に必要なスペースよりも多くのスペースを要求する非常に一般的な方法が 1 つありますMargin。それ以上のスペースを要求するには、カスタム コントロールを作成する必要があります。
  2. に表示される制約は、設定されている場合、 /および/の制限とMeasureCore関係があることがわかります。MinWidthMinHeightMaxWidthMaxHeight

そうです、ドキュメントにあるように、コントロールは必要以上のスペースを要求できます。を除いて、デフォルトのコントロールはどれもこれを行うようには見えMarginず、パネルなどのコンテナはそれを尊重する必要はありません。ほとんどの状況では、子供の親の観点からも意味をなさないため、ドキュメントで読んだことを利用することはありません。

を作成しUserControl、XAML でWidthとの値を削除して任意の を返すようにオーバーライドし、そのインスタンスを に配置すると、返された に表示されます。HeightMeasureOverrideSizeCanvasSize

レイアウト システムのこの機能は、カスタム パネル、カスタム コントロール、またはユーザー コントロールを作成する場合に役立ちますが、それ以外の場合はおそらく役に立ちません。しかし、それはそこにあります。ドキュメントは正しいです。

于 2009-08-07T13:44:39.930 に答える
0

独自のメソッドからSize>を返す場合、 (メソッドを呼び出す) はそれを記憶しますが、= に設定されます。これにより、子コントロールが (たとえば) 明示的に指定された幅/高さのグリッド セルに適していることが保証されます。しかし、あなたの「クリップされていない」を覚えているので、パラメーター=あなたのオリジナルを受け取る必要があります。その結果、コントロールは元の に従って子を「仮想的に」配置しますが、実装により、そのような親グリッドセルのコントロールがクリップされます。具体的なクリッピング方法は、(コントロールのプロパティ) などのプロパティの実際の値によって異なります。availableSizeMeasureOverrideFrameworkElement.MeasureCoreDesiredSizeavailableSizeFrameworkElement.MeasureCoreDesiredSizeArrangeOverrideDesiredSizeDesiredSizeFrameworkElementHorizontal/VerticalAlignment

于 2012-01-10T13:16:12.663 に答える