WinformsのC#.Netで、ほとんどすべてのコンポーネントに2つのイベント、Resize()とSizeChanged()が見つかりました。それらの間に違いはありますか?両方のイベントが同じである場合、C#が2つの異なるイベントを提供するのはなぜですか?
C#でユーザーコントロールを作成しています。このコントロールにはテキストボックスが含まれています。ユーザーがコントロールのサイズを変更したときにテキストボックスのサイズを変更したいのですが。どのイベントを使用する必要があるのか、そしてその理由について混乱しています。
Resize
イベントは、コントロールのサイズが変更されたときに発生し、SizeChanged
イベントは、Size
プロパティが変更されたときに発生します。
サイズ変更によってSize
プロパティが変更されるため、どちらを使用してもかまいません。ただし、 Resize および SizeChanged イベントのドキュメントで推奨されているように、Layout
イベントを使用する必要があります。
IS ResizeイベントとSizeChangedイベントの違いは?
信じられないかもしれませんが絶対に何もありません。一方のメソッドが他方を呼び出します。ただし、後者は「Changed」という名前が付けられているため、データバインディングに使用できます。具体的な証明はありませんが、両方が存在する理由についての私の理論です。
時々これらの答えはソースコードから来るだけです:
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"
_に設定してレイアウトをトリガーします。たとえば、注意が必要な理由は、ロジックが基本実装の前に(したがって無効化の前に)実行され、画面に適切に描画されるようにするためです。
これらは、SizeChanged
とResize
をほぼ同じように平行移動する2つの移動イベントです。例外は、OnMove()
が無効になるのは、スタイル _ControlStyles.SupportsTransparentBackColor
_ がtrueで、背景色が不透明なアルファ値。また、OnMove()
はレイアウトをトリガーしません。
繰り返しますが、この違いは、おそらく著者を制御するためにのみ重要です。
ソースコードを調査した結果、Resize
およびMove
イベントはプロパティ変更イベントからabstraction離れており、これらの特定のイベントのサブスクライブとオーバーライドの両方に推奨される選択肢です。
他の人が言及するように、 Layout
イベントと OnLayout()
関数もまともな選択です。ただし、レイアウトは多くの場合に発生します。
サイドノート:「その他の変更」は曖昧ですが、マイクロソフトがレイアウトを必要とする継承者によって実行されたアクションを参照していること。
レイアウトイベントに依存しすぎると、単純なサイズ変更イベントよりも頻繁に発生するため、コード/コントロールが遅くなる可能性があります。または、レイアウトエンジンが SuspendLayout()
によって中断されている可能性があります。この場合、Layout
を使用してサイズの変更に対応できませんイベント。