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 イベントが要素から再度発生する可能性があります。 具体的な内容は次のとおりです。

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

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

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

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

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

適用対象

こちらもご覧ください