【发布时间】:2016-09-21 07:37:22
【问题描述】:
在我的测试中,我看到SelectedIndexChanged 总是在Click 之前触发标签控件。
我的问题:
这种行为是否由 .NET Framework保证,或者是否存在首先触发 Click 事件的情况?到目前为止,我没有在文档中找到任何关于调用顺序的说明。
【问题讨论】:
在我的测试中,我看到SelectedIndexChanged 总是在Click 之前触发标签控件。
我的问题:
这种行为是否由 .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...
}
}
【讨论】: