FrameworkElement.SizeChanged イベント

定義

ActualHeight プロパティまたは ActualWidth プロパティが FrameworkElement の値を変更したときに発生します。

public:
 virtual event SizeChangedEventHandler ^ SizeChanged;
// Register
event_token SizeChanged(SizeChangedEventHandler const& handler) const;

// Revoke with event_token
void SizeChanged(event_token const* cookie) const;

// Revoke with event_revoker
FrameworkElement::SizeChanged_revoker SizeChanged(auto_revoke_t, SizeChangedEventHandler const& handler) const;
public event SizeChangedEventHandler SizeChanged;
function onSizeChanged(eventArgs) { /* Your code */ }
frameworkElement.addEventListener("sizechanged", onSizeChanged);
frameworkElement.removeEventListener("sizechanged", onSizeChanged);
- or -
frameworkElement.onsizechanged = onSizeChanged;
Public Custom Event SizeChanged As SizeChangedEventHandler 
<frameworkElement SizeChanged="eventhandler"/>

イベントの種類

注釈

SizeChangedは、Measure パスと Arrange パスの完了後にオブジェクトのサイズ (ActualHeight または ActualWidth) が変更されるたびに発生します。

SizeChanged イベントの SizeChangedEventArgs イベント データには、レイアウト変更が発生する前の要素のサイズを表す PreviousSize 値と、現在のサイズを表す NewSize 値の 2 つのプロパティが用意されています。 高さと幅の情報を取得するには、イベント ハンドラー内でこれらの SizeChangedEventArgs プロパティの Size 構造体値の HeightWidth の値を使用します。

SizeChanged イベントを処理する理由の 1 つは、新しいレイアウトのために、要素の ActualHeightActualWidth の比率が変わったかどうかを確認することです。 たとえば、ユーザーがアプリ ウィンドウのサイズを変更し、アプリ全体のビューが狭いビューになった場合に発生する可能性があります。

SizeChanged は、UI 要素の ActualHeightActualWidth の値はレイアウトが行われる前に未定義であるため、アプリが最初にアクティブになったときに、ページ上の要素の初期レイアウト中に発生します。 これらは初期レイアウト パス中にのみ値を取得するため、SizeChanged イベントが発生します。 その後、アプリの有効期間中に、ActualHeightActualWidthの値が他の理由で変更された場合に、SizeChanged イベントが要素から再度発生する可能性があります。 これらには次のものが含まれます。

  • その要素の高さとを具体的に調整するコード。
  • 制約プロパティを変更するコード (ActualHeight に影響を与える MinHeightMaxHeight など)。
  • 更新されたデータ バインド値、または FrameworkElement のレイアウト関連プロパティに影響する新しいスタイルが適用されました。
  • 要素の親である PanelListBox などのコンテナーのディメンションを調整するコード。 これにより、多くの場合、レイアウト パスがトリガーされます。 新しいレイアウト条件により、含まれている子要素の空き領域が増減し、その結果、その中の要素に対して新しい ActualHeightActualWidth が作成される可能性があります。
  • 実行時に発生するその他の変更は、 FrameworkElement レイアウト プロパティを直接変更していない場合でも、レイアウト領域を変更します。 たとえば、アイテムへのデータ バインドに基づくリストが更新または更新され、アイテム、項目コントロール、リスト ビューなどのサイズ変更が発生する可能性があります。 または、増分読み込みをサポートするリスト ビューで、より多くの項目をフェッチし、リスト ビューを展開する場合があります。
  • ユーザーはアプリ のウィンドウ サイズ (Window.SizeChanged が発生します) を変更します。このサイズは、最上位 ページ のサイズと、"自動" レイアウトまたは Stretch 配置を使用し、寸法を指定しなかったページ内の要素のアダプティブ レイアウト派生サイズに影響します。
  • ApplicationView の変更または DisplayInformation の変更。最終的にはウィンドウとページのディメンション、および内部のすべての UI 要素に影響を与える可能性があります。

SizeChanged ハンドラー内から現在のオブジェクトのレイアウトに影響を与える他の API を呼び出さないようにする必要はありません。 例: 高さ または を設定します。 InvalidateMeasure または UpdateLayout の呼び出し。 ApplyTemplate の呼び出し。子要素のサイズを変更し、親レイアウトを無効にする可能性のあるすべての操作。 レイアウト エンジンには、オブジェクトが再度イベントを発生させる前に値を安定させる内部ロジックがあるため、通常、ロジックはループ状態を回避するのに十分な堅牢性を備えます。 ただし、アプリをハングさせる可能性のあるサイズ変更ループやレンダリング ループを誤って定義する可能性があります。通常は、実際にハングするのではなく 、LayoutCycleException などの例外をスローします。 これは、ハンドラー ロジックを周囲のレイアウトと組み合わせて、関連するオブジェクトのサイズの最終的な結果に到達できない場合に発生します。

親コンテナー内のオブジェクトの位置が変更されても、サイズは変更されない場合、 SizeChanged は発生しません。

LayoutUpdated も同様のイベントですが、 LayoutUpdated は位置の変更にも発生します。 また、発生 LayoutUpdated 特定のオブジェクトのレイアウト プロパティにスコープが設定されていない場合は、オブジェクトが含まれているビジュアル ツリー全体がレポートされます。 LayoutUpdated は、オブジェクトを含むビジュアル ツリー全体内の何かが変更されたが、ハンドラーがアタッチされているオブジェクトのレイアウトの詳細 (サイズ、位置) が変更されていない可能性があることを通知します。

このイベントは 、RoutedEventHandler 関連のデリゲートと RoutedEventArgs 派生クラスをイベント データとして使用しますが、イベントは本当にルーティング イベントではありません。 オブジェクト ツリーをバブルスルーしません。 イベントの発生元の要素 (つまり、送信者) でのみ処理できます。 このイベントのイベント データの OriginalSource は常にnullされるため、OriginalSourceを使用しないでください。

適用対象

こちらもご覧ください