在我的测试中,我看到SelectedIndexChanged
始终在Click
之前触发了标签控件。
我的问题:
.NET Framework的这种行为是保证,还是存在首先触发Click
事件的情况?到目前为止,我没有找到任何关于文档中的调用顺序的说明。
答案 0 :(得分:1)
您可以查看控件TabControl的source code。
基本上SelectedIndexChanged
会在WndProc
的{{1}}内触发。
TabControl
在基类Control类的OnClick
中被触发。
在WndProc
WndProc
的末尾调用基础WndProc
(这是最后一条指令),因此TabControl
将始终在SelectedIndexChanged
之前被触发{1}}事件。
以下是涉及的代码:
TabControl的WndProc
Click
控制的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
}