私のテストでは、SelectedIndexChanged
は、タブコントロールとしてClick
より前に常にトリガーされています。タブで "SelectedIndexChanged"が必ず "クリック"の前にトリガーされることが保証されていますか?
私の質問:
は、この動作は、.NET Frameworkによってを保証されている、またはClick
イベントが最初にトリガーされる状況がありますか?これまでのところ、私はドキュメンテーションの呼び出し順序に関して何も言及していませんでした。
私のテストでは、SelectedIndexChanged
は、タブコントロールとしてClick
より前に常にトリガーされています。タブで "SelectedIndexChanged"が必ず "クリック"の前にトリガーされることが保証されていますか?
私の質問:
は、この動作は、.NET Frameworkによってを保証されている、またはClick
イベントが最初にトリガーされる状況がありますか?これまでのところ、私はドキュメンテーションの呼び出し順序に関して何も言及していませんでした。
コントロールTabControlのsource codeを確認できます。
は、TabControl
のWndProc
でトリガされます。
OnClick
は、基本ControlクラスのWndProc
で発生します。
ベースWndProc
は(それが最後の命令である)TabControl
のWndProc
の最後に呼び出されるので、SelectedIndexChanged
は常にClick
イベントの前に起動されます。
は、ここでのコードの断片が関与している:
のTabControlのWndProcメソッド
protected override void WndProc(ref Message m) {
switch (m.Msg) {
// Something...
case NativeMethods.WM_REFLECT + NativeMethods.WM_NOTIFY:
NativeMethods.NMHDR nmhdr = (NativeMethods.NMHDR) m.GetLParam(typeof(NativeMethods.NMHDR));
switch (nmhdr.code) {
case NativeMethods.TCN_SELCHANGE:
if (WmSelChange()) // Here will fire the event {
m.Result = (IntPtr)1;
tabControlState[TABCONTROLSTATE_UISelection] = false;
return;
}
else {
tabControlState[TABCONTROLSTATE_UISelection] = true;
}
break;
}
break;
}
// Something...
base.WndProc(ref m); // The Control WndProc
}
コントロールのWndProcメソッド
protected virtual void WndProc(ref Message m) {
// Something...
switch (m.Msg) {
// Something...
case NativeMethods.WM_LBUTTONUP:
WmMouseUp(ref m, MouseButtons.Left, 1); // Here will fire Click event
break;
// Something...
}
}
アップ&と受け入れました。将来のための良いアイデアは、ソースコードを確認する。どうも! –