【问题标题】:Is guaranteed in a tab "SelectedIndexChanged" always triggers before "Click"?保证在选项卡中“SelectedIndexChanged”总是在“点击”之前触发?
【发布时间】:2016-09-21 07:37:22
【问题描述】:

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

我的问题:

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

【问题讨论】:

    标签: c# .net winforms events


    【解决方案1】:

    可以查看控件TabControl的source code

    基本上SelectedIndexChanged是在TabControlWndProc中触发的。

    OnClick 在 Control 基类的 WndProc 中触发。

    基础WndProcTabControlWndProc 末尾调用(它是最后一条指令),因此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...
        } 
    }
    

    【讨论】:

    • 升级并接受。将来检查源代码的好主意。谢谢!
    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多