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) が変更されるたびに発生します。

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

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

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

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

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

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

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

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

適用対象

こちらもご覧ください