2009-08-07 4 views
2

私はMSDNのFrameworkElement.MesureOverrideを見て、レイアウトエンジンの背後にあるメカニズムを理解しようとしていました。MesureOverrideがavailableSizeより多くを返しますか?

このプロセスでは、子要素は、利用可能な初期サイズよりも大きなDesiredSizeサイズを返して、子要素がより多くのスペースを必要としていることを示している可能性があります。

私はリフレクターを近くに持っていたので、MesureOverrideを呼び出すMesureCoreを調べました。私が理解できることから、MesureOverrideの戻り値は常に0とavailableSizeの間で制限されています。だから何が起きているの?

答えて

1

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

MeasureCoreは、thisのMeasureOverrideのみを呼び出します。あなたは物語のごく一部しか取得していません。 The Layout Systemは、要素のツリー内の最上部のPanelにあるMeasureを呼び出すことから始まり、MeasureCorethisに呼び出します。ただし、のFrameworkElementには、数か所でMeasureOverrideがコールされます。

ここで、0とavailableSizeの間に上限がありますか?

編集:日時:「まあ、のMeasureCoreの最後の行...」私が言ったように、あなたはすべてのことのほんの一部を見ている

が進みます。

  1. すべてのコントロールには、実際に必要なスペースより多くのスペースを要求する非常に一般的な方法が1つあります。Margin。それ以上のスペースを要求するカスタムコントロールを作成する必要があります。あなたは私が言うことができるものから、MeasureCoreで見る
  2. 制約は、それらが設定されている場合、MinWidth/MinHeightMaxWidth/MaxHeight限度としなければなりません。

だから、ドキュメントに書かれているように、コントロールは必要以上のスペースを要求できます。デフォルトのコントロールのどれもMarginとは別のものではなく、パネルなどのコンテナはそれを尊重する必要はありません。大部分の状況では、子供の親の視点からも意味をなさないので、ほとんどの状況ではドキュメントで読んだ内容を利用しません。

あなたがUserControlを作成した場合は、XAMLでWidthHeight値を取り除くとCanvasでそれのインスタンスを配置し、その後、任意のSizeを返すようにMeasureOverrideを上書きしてしまった、あなたはそれはあなたが戻っSizeに表示さ見るでしょう。

このレイアウトシステムの機能は、カスタムパネルやカスタムコントロール、またはユーザーコントロールを作成している場合には使用できますが、そうでない場合はおそらくそうかもしれません。しかしそれはそこにあります。マニュアルが正しい。

+0

MesureCoreの最後の行は、新しいサイズの戻り値です(Math.Max(0.0、width)、Math.Max(0.0、height))。 (これは唯一のreturn文です)、少し前に、if(width> availableSize.Width)width = availableSize.Widthのようなifが2つあります。 – subb

0

あなた自身MeasureOverride方法、FrameworkElement.MeasureCore(あなたのメソッドを呼び出す)から>availableSizeSizeを返した場合、それを覚えていますが、DesiredSizeは= availableSize設定されます。これにより、子コントロールが明示的に指定された幅/高さのグリッドセル(たとえば)に適していることが保証されます。 FrameworkElement.MeasureCoreはあなたの "unclipped" DesiredSizeを覚えています。ArrangeOverrideには、元のDesiredSizeというパラメータが必要です。その結果、あなたのコントロールは "実質的に"オリジナルのDesiredSizeに従って子供たちを手配しますが、FrameworkElementの実装はそのような親のグリッドセルのコントロールをクリップします。具体的なクリッピング方法は、Horizontal/VerticalAlignment(コントロールのプロパティ)のようなプロパティの実際の値に依存します。

関連する問題