在选项卡“SelectedIndexChanged"”中得到保证;总是触发"点击"

本文关键字:quot 点击 选项 SelectedIndexChanged | 更新日期: 2023-09-27 18:07:57

在我的测试中,我看到SelectedIndexChanged总是在选项卡控件的Click之前触发。

我的问题:

这种行为是由。net框架保证的,还是有Click事件首先触发的情况?到目前为止,我没有发现文档中有任何关于调用顺序的说明。

在选项卡“SelectedIndexChanged"”中得到保证;总是触发"点击"

可以查看控件TabControl的源代码。

基本上SelectedIndexChangedTabControlWndProc中被触发。

OnClick在Control基类的WndProc中被触发。

基本的WndProcTabControlWndProc的末尾被调用(它是最后一条指令),所以SelectedIndexChanged总是在Click事件之前被触发。

以下是所涉及的代码片段:

TabControl的指向

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
}

控件的指向

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...
    } 
}