web-dev-qa-db-ja.com

ResizeイベントとSizeChangedイベントの違い

WinformsのC#.Netで、ほとんどすべてのコンポーネントに2つのイベント、Resize()とSizeChanged()が見つかりました。それらの間に違いはありますか?両方のイベントが同じである場合、C#が2つの異なるイベントを提供するのはなぜですか?

C#でユーザーコントロールを作成しています。このコントロールにはテキストボックスが含まれています。ユーザーがコントロールのサイズを変更したときにテキストボックスのサイズを変更したいのですが。どのイベントを使用する必要があるのか​​、そしてその理由について混乱しています。

29

Resizeイベントは、コントロールのサイズが変更されたときに発生し、SizeChangedイベントは、Sizeプロパティが変更されたときに発生します。

サイズ変更によってSizeプロパティが変更されるため、どちらを使用してもかまいません。ただし、 Resize および SizeChanged イベントのドキュメントで推奨されているように、Layoutイベントを使用する必要があります。

25
Guffa

IS ResizeイベントとSizeChangedイベントの違いは?

信じられないかもしれませんが絶対に何もありません。一方のメソッドが他方を呼び出します。ただし、後者は「Changed」という名前が付けられているため、データバインディングに使用できます。具体的な証明はありませんが、両方が存在する理由についての私の理論です。

14

時々これらの答えはソースコードから来るだけです:

サイズ変更

SizeChanged イベントは OnSizeChanged() によって発生します。この関数は、次にUpdateBounds()によってのみ呼び出されます。これは、主に _WM_MOVE_ および _WM_WINDOWPOSCHANGED_の処理を含む)いくつかのメカニズムによって呼び出されます メッセージ。

再びソースから、OnSizeChanged()は、UpdateBounds()old size新しいサイズ。したがって、はい、他の人がすでに決定しているように、SizeChangedイベントはSizeプロパティの変化に対応します。

リサイズ

Resize イベントは異なりますが違いはありません。 OnResize() によって発生します。この関数は、OnSizeChanged()の直接の結果として呼び出されます。ただし、その逆は当てはまりません。つまり、OnResize()DOES NOTcall OnSizeChanged()

違いは、これらのAPIを使用する視点にあります。これらのイベントをサブスクライブするだけの場合、実質的に違いはありません。どちらにしても、コントロールのサイズが変更されると、両方のイベントが発生します。

ただし、Controlを継承する場合は、次の違いに注意する必要があります。

  • OnResize()は、スタイル _ControlStyles.ResizeRedraw_ が設定されている場合、コントロールをinvalidateします。
  • OnResize()AffectedProperty を_"Bounds"_に設定してレイアウトをトリガーします。

たとえば、注意が必要な理由は、ロジックが基本実装の前に(したがって無効化の前に)実行され、画面に適切に描画されるようにするためです。

LocationChangedとMove

これらは、SizeChangedResizeをほぼ同じように平行移動する2つの移動イベントです。例外は、OnMove()が無効になるのは、スタイル _ControlStyles.SupportsTransparentBackColor_trueで、背景色が不透明なアルファ値。また、OnMove()はレイアウトをトリガーしません。

繰り返しますが、この違いは、おそらく著者を制御するためにのみ重要です。

結論

ソースコードを調査した結果、ResizeおよびMoveイベントはプロパティ変更イベントからabstraction離れており、これらの特定のイベントのサブスクライブとオーバーライドの両方に推奨される選択肢です。

他の人が言及するように、 Layout イベントと OnLayout() 関数もまともな選択です。ただし、レイアウトは多くの場合に発生します。

  • 子コントロールが追加/削除されたとき。
  • コントロールの境界が変更されたとき。
  • その他の変更が発生すると、コントロールのレイアウトに影響を与える可能性があります。

    サイドノート:「その他の変更」は曖昧ですが、マイクロソフトがレイアウトを必要とする継承者によって実行されたアクションを参照していること。

レイアウトイベントに依存しすぎると、単純なサイズ変更イベントよりも頻繁に発生するため、コード/コントロールが遅くなる可能性があります。または、レイアウトエンジンが SuspendLayout() によって中断されている可能性があります。この場合、Layoutを使用してサイズの変更に対応できませんイベント。

11
Nick Miller