在“ClickIndexChanged”选项卡中保证始终在“Click”之前触发?

时间:2016-09-21 07:37:22

标签: c# .net winforms events

在我的测试中,我看到SelectedIndexChanged始终在Click之前触发了标签控件。

我的问题:

.NET Framework的这种行为是保证,还是存在首先触发Click事件的情况?到目前为止,我没有找到任何关于文档中的调用顺序的说明。

1 个答案:

答案 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
}