dafeng520 发表于 2013-12-10 08:31:00

【WinForms】控件事件触发顺序问题

现开发了多窗体程序,在两窗体间切换时,事件触发顺序应该为windowActive,controlActive。
我在使用C1TabControl时,发现是先触发SelectionChanged事件,然后再window激活。别的控件事件触发顺序则正常。
请问,如何实现先window激活事件,后SelectionChanged事件?
谢谢!

iceman 发表于 2013-12-10 16:37:00

回复 1楼dafeng520的帖子

dafeng520 你好,

我通过附件 Demo 测试,调用子 Form 时。首先触发 Form2_Activated 事件,然后才触发的 c1DockingTab1_SelectedIndexChanged 事件,所以没能重现你的问题,请参考:



如果不能解决问题,请上传 Demo 到论坛调试。

dafeng520 发表于 2013-12-10 16:51:00


你好,我的是wpf的例子,你先新增两个窗体,然后测试。

iceman 发表于 2013-12-10 18:21:00

回复 3楼dafeng520的帖子

感谢发送demo,问题正在调查中,明天回复。

iceman 发表于 2013-12-11 13:22:00

回复 3楼dafeng520的帖子

dafeng520 你好,
能否补发图中三个缺少的 DLL:

dafeng520 发表于 2013-12-11 19:16:00

iceman 发表于 2013-12-12 14:53:00

回复 6楼dafeng520的帖子

dafeng520 你好,
可以通过以下代码判断当前UserControl是否加载完:

      private void C1TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
      {
            if (this.IsLoaded)
            {
                Debug.Print("C1TabControlClicked" + (sender as C1TabControl).SelectedIndex + ":" + title);
            }
      }

dafeng520 发表于 2013-12-13 08:31:00

经测试,此方法不能解决问题啊。
WindowActivated:test1848543519
btnClicked:test1848543519
WindowActivated:test1240895648
btnClicked:test1240895648

C1TabControlClicked1:test1848543519
WindowActivated:test1848543519
C1TabControlClicked1:test1240895648
WindowActivated:test1240895648
C1TabControlClicked0:test1848543519
WindowActivated:test1848543519

上面显示出,先触发了窗体事件,后触发控件事件。
下面显示出,在C1TabControl中,是先触发控件事件,后触发了窗体事件。(此处Tab是切换了的)。

iceman 发表于 2013-12-13 11:27:00

回复 8楼dafeng520的帖子

事件触发顺序我们可能没法办法更改。使用 7# 中的代码的作用是判断当前 UC 是否加载完成,如果未加载则不执行C1TabControl_SelectionChanged 中的代码。
附件是我的操作行为,切换 Tab 后并没有触发WindowActivated事件,请查看,看我们操作有哪些不同,我再继续跟踪调查:

dafeng520 发表于 2013-12-13 13:58:00

你好,你没有理解我的意思,当我打开两个窗口后,先把两个窗体平铺开来,当win1处于激活状态时,直接点击win2里的TabControl控件,而不是先使win2激活。
页: [1] 2
查看完整版本: 【WinForms】控件事件触发顺序问题