アンビエントプロパティはいつ反映されるか?
アンビエントプロパティを利用して、いつコントロールのFontが変更されるかってのを調べてみました。FormだけFontを変更して、子コントロールでOnFontChangedやら何やらにブレーク張って追っかけです。
ほぼ、コントロールの生成過程の調査です。
- コントロールのコンストラクタ
- コントロールのOnHandleCreated
- コントロールのOnCreateControl
- コントロールのOnLoad ← ここまではFont変化なし
- 親でBeginUpdate
- 親でコントロールをAddRange
- コントロールのOnParentChanged ← ここで既にFontが反映されていた
- コントロールのOnFontChanged
- 続いて、親のEndUpdate
おもしろいことに、コントロールを親から削除したとき(親.Controls.Clear(); したとき)にもわざわざFontが元に戻されていました。
ここまで調べて、この説明の意味がやっと理解できました。コントロールを親に載せたとき、親がいなくなったときにアンビエントプロパティが反映されるんですね。親が変更されたときってことですね。(ほとんどそのままのことが書いてあるけど理解できなかった)
親に載せる前にサイズを決定するには、アンビエントプロパティは使えないってことか!orz
ここにある、「メモ 優れたパフォーマンスを維持するには、コンストラクタでコントロールのサイズを設定しないでください。 DefaultSize プロパティをオーバーライドする方法をお勧めします。」の文章が、すっごく気になった。
どうしてなんだろう?コンストラクタを抜けた後にサイズを設定するのは問題ないんだろうか?
やっぱWinFormのソース、くれくれ。