- 締切済み
c# Moveイベなしで子コントロールの移動を感知
こんにちは。c#初心者です。 今までは子コントロールが移動した事を知るためにはMoveイベントを使ってきたのです。が、ちょっと気になって、OnMoveメソッドを(空のメソッドで)オーバーライドしてMoveイベントを発生させないコントロールを作ってTableLayoutPanelで普通のButtonコントロールと比較実験してみました。 すると、普通のButtonではLeft += 10;とすると、ひとまず左にずれ、イベントが発生し、そこからTableLayoutPanelに戻されて、再びイベントが発生する、という流れでした(もうこの時点でイベントが2回しか発生していないので、次を見なくても分かるのですが)。 その後、Moveイベントを発生させないコントロールで同様にLeft += 10;とすると、無論イベントは発生しませんでしたが、確かに左へ10動いた後、右へ10動きました。 Resizeも同様に比較しましたが、同様の結果が得られました。 何が言いたいかのと言うと、どうやらTableLayoutPanelはMoveイベント(Resizeイベント)を使わずに子コントロールの移動/サイズ変更を感知しているようで、この真似をしたいのですが、どうすればよいのでしょうか? OnMove(OnResize)メソッドの後に呼び出され、親コントロールに移動/サイズ変更を伝えるメソッドがControlクラスにあると思ったのですが、それも見当たりません。 どなたか、分かる方、いらっしゃいましたら教えていただけませんか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Yune-Kichi
- ベストアンサー率74% (465/626)
細かい動作はUnoducmnetedの様ですが……。 .NET Fx 4.0におけるStackTraceとReference SourceCodeを見る限り, 1. 子コントロールが移動する 2. 子コントロール (のset_Left) が自身のSetBoundsを呼び出す 3. 子コントロールのSetBoundsがSystem.Windows.Forms.Layout.LayoutTransaction.DoLayoutを呼び出す (LayoutTransactionはinternal staticなクラス) 4. 親コントロールのPerformLayoutが呼び出される 5. 親コントロールのOnLayoutが呼び出される→Control.OnLayoutが呼び出される 6. LayoutEngine.Layoutが呼び出される→TableLayout.LayoutCoreが呼び出される (System.Windows.Forms.layout.TableLayoutはLayoutEngineを継承したinternalクラス) 7. 再レイアウトされる という動作になっています。 OnLocationChangedでスタックトレースを出力させて,それに合わせてReference SourceCodeを参照していくことで,上記のような情報が得られます。 ref) Microsoft Reference Source Code Center http://referencesource.microsoft.com/ カスタムのレイアウトを用意したいのであれば,MSDNに記述があります ref) 方法 : カスタム レイアウト エンジンを実装する http://msdn.microsoft.com/ja-jp/library/ms171727.aspx