0
在我的测试中,我看到SelectedIndexChanged
总是在选项卡控件的Click
之前触发。在选项卡中保证“SelectedIndexChanged”总是在“点击”之前触发?
我的问题:
这种行为由.NET Framework保证,还是那里的Click
事件第一次被触发的情况呢?到目前为止,我没有发现关于文档中的调用订单的任何内容。
在我的测试中,我看到SelectedIndexChanged
总是在选项卡控件的Click
之前触发。在选项卡中保证“SelectedIndexChanged”总是在“点击”之前触发?
我的问题:
这种行为由.NET Framework保证,还是那里的Click
事件第一次被触发的情况呢?到目前为止,我没有发现关于文档中的调用订单的任何内容。
您可以检查控制TabControl的source code。
基本上SelectedIndexChanged
在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...
}
}
调试与验收。未来检查源代码的好主意。谢谢! –