2

Dependency プロパティの 1 つが変更された場合にレイアウトを更新する必要があるカスタム コントロールを作成しています。FrameworkMetadataProperty.AffectsMeasureまたは を使用できますFrameworkMetadataProperty.AffectsArrange

Q.1 - どちらを使うべきか迷っています。

さらに、UI を更新するために、UpdateLayout メソッドと InvalidateVisual メソッドも使用できます。

Q.2 - これらの 4 つのものはすべて似ているように見えますが、いつどれを使用すればよいか混乱しますか?

4

1 に答える 1

9

まず、 FrameworkPropertyMetadataOptionsを設定することと、メソッドを UpdateLayout または InvalidateVisual として呼び出すことの違いは明らかです。後者の場合、制御コードでこれらのメソッドを呼び出しますが、前者の場合、フレームワークによって適切なメソッドが呼び出されます。

との違いはAffectsMeasure、一方がUIElement.InvalidateMeasureAffectsArrangeを呼び出す(「レイアウトのメジャー パスに影響する」) ことと、もう一方がUIElement.InvalidateArrangeを呼び出す(「レイアウトのアレンジ パスに影響する」) ことです。

違いはUIElement.Measureの備考から明らかです:

レイアウトが最初にインスタンス化されるとき、配置の前に常に Measure 呼び出しを受け取ります。ただし、最初のレイアウト パスの後、Measure なしで Arrange 呼び出しを受け取る場合があります。これは、配置のみに影響するプロパティが変更された場合 (配置など)、または親がメジャーなしで配置を受け取った場合に発生する可能性があります。Measure 呼び出しは、Arrange 呼び出しを自動的に無効にします。

およびUIElement.InvalidateMeasureの備考から:

このメソッドを呼び出すと、内部で InvalidateArrange も呼び出されます。InvalidateMeasure と InvalidateArrange を連続して呼び出す必要はありません。


更新: UpdateLayout と InvalidateVisual の違いについては、UpdateLayoutの備考を参照してください。

このメソッドを呼び出すと、 IsMeasureValid false または IsArrangeValid false を持つ要素は、要素固有の MeasureCore メソッドと ArrangeCore メソッドを呼び出し、レイアウトの更新を強制し、計算されたすべてのサイズが検証されます。

レイアウトが変更されていない場合、またはレイアウトの配置も測定状態も無効でない場合、このメソッドを呼び出しても効果はありません。ただし、いずれかの点でレイアウトが無効な場合、UpdateLayout 呼び出しはレイアウト全体をやり直します。したがって、要素ツリーの増分変更やマイナー変更のたびに UpdateLayout を呼び出さないようにする必要があります。レイアウト システムは、パフォーマンスと最新性のバランスをとるアルゴリズムを使用し、すべての子要素が有効になるまでルートへの変更を延期する重み付け戦略を使用して、延期された方法で要素のレイアウトを実行します。サイズと位置の更新が絶対に必要な場合にのみ、UpdateLayout を呼び出す必要があります。また、制御し、レイアウトに影響を与える可能性があるプロパティへのすべての変更が完了したことを確認してからにしてください。

およびInvalidateVisualで:

このメソッドは、InvalidateArrange を内部的に呼び出します。

このメソッドは通常、アプリケーション コードからは呼び出されません。WPF フレームワーク レベルのレイアウト システムは、要素のビジュアル ツリーの変更を独自に処理し、既に必要な場合はこのメソッドと同等のメソッドを呼び出しています。このメソッドの呼び出しは、高度なシナリオでのみ必要です。そのような高度なシナリオの 1 つは、Freezable または FrameworkElement 派生クラスにない依存関係プロパティの PropertyChangedCallback を作成している場合で、変更時にレイアウトに影響を与える場合です。

于 2013-01-19T13:05:17.637 に答える