【问题标题】:Is there any case in which the Form's Activated event is not raised?有没有没有引发表单的激活事件的情况?
【发布时间】:2013-04-25 14:37:57
【问题描述】:

我不明白为什么会这样,我认为应该在显示表单时引发 Activated。事实上,我的表单已将 TopLevel 设置为 false,并且它已添加到另一个表单中。当主窗体显示时,它也是可见的,我可以与它的控件进行交互,但我测试并看到 Activated 没有被提升。

public MainForm(){
     InitializeComponent();
     Form child = new Form();
     child.Activated += (s,e) => {
        MessageBox.Show("Activated!");
     };
     child.Size = new Size(200,100);
     child.TopLevel = false;
     child.Show();
     child.Parent = this;
}

运行 MainForm 后,子窗体出现在主窗体中,并且没有显示任何带有消息“已激活!”的 MessageBox。

要提高它的额外工作是什么?

【问题讨论】:

    标签: c# winforms events raiseevent


    【解决方案1】:

    如果第二个表单是第一次出现在屏幕上,你可以使用 Shown 事件。

    Activate 事件仅在表单获得焦点时触发,但不包含第一次显示。但是,如果之前处于活动状态的表单在您的应用程序之外,它不会引发激活事件。我的意思是它仅在查看同一项目的表单时有效。

    【讨论】:

    • 好吧,这将是一个替代品,但这是否意味着无法提高 Activated?
    • 它的意思是Activated 不是你想的那个意思;你想要的是Shown
    • Activated 是一个事件,我想知道它会在什么条件下引发,你不觉得这很奇怪吗?或者至少向我解释在这种情况下不能提出激活,发​​布一些链接......,显示是另一种解决方法,但不适用于所有情况(不能替换激活),如果不是这样,为什么激活确实存在? ??
    • 我相信 Activated 只有在表单接收到输入焦点时才会被提升,无论是通过用户点击它还是您调用 child.Activate()
    • 激活事件是否会创建 From 的新实例?
    【解决方案2】:

    这是我的答案,我注意到只有 Form 有 Activated 事件,其他控件没有,一旦 Form 的 TopLevel 设置为 false,我认为它被视为普通控件,在这种情况下,Activate()方法不会做任何事情,并且在任何情况下都不会引发 Activated 事件。我想这就是为什么没有提出Activated的原因。

    感谢 Kuzgun 提出的使用 Shown 的建议,但这主要是解释为什么没有提出 Activated!

    这个答案只是我的猜测,甚至关于 Form.Activated 事件的 MSDN 页面也没有提到这一点。不应以这种方式错过,尤其是在官方文档页面中。

    【讨论】:

      【解决方案3】:

      一旦FormTopLevel 属性设置为false,那么表单就变成了普通控件,因此Activated() 事件将不会触发。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        相关资源
        最近更新 更多