【问题标题】:Windows Forms: Activate method and Activated eventWindows 窗体:Activate 方法和 Activated 事件
【发布时间】:2011-06-09 20:40:16
【问题描述】:

当我按如下方式加载表单时:

     MYFORM f = new MYFORM();
     f.MdiParent = this;
     f.Show();

它的 MyForm_Activated 事件触发。但是当我调用表单的 Activate 方法时:

     // if form is already loaded just activate it:
       f.Activate();

MyForm_Activated 事件不会触发。这种行为是设计使然还是我遗漏了什么?我希望表单的激活事件在表单被激活时触发。那可能吗?谢谢

为清晰而编辑:

我有一个启动子表单的 MDI 父表单。子窗体显示一个报表,并通过其构造函数告诉它要显示哪个报表:

     public   ReportForm( MyReport RPT)
         {
             InitializeComponent();
             this.reportViewer1.Report = RPT;
             this.reportViewer1.RefreshReport();  
          }

父 MDI 表单执行此操作以启动 ReportForm:

            ActivateOrLoad action = ActivateOrLoad.Load;   // default; a custom enum

            foreach (Form ff in this.MdiChildren)
           {
             if (ff.Name == "ReportForm")
             {
                 action = ActivateOrLoad.Activate;  
                 ff.Activate();
             }
           }

           //load the form only if it is not already loaded
            if (action == ActivateOrLoad.Load)
             {
               ReportForm f = new ReportForm( new MyReports.CustomerList() );
               f.MdiParent = this;
               f.Show();
             }

当子 ReportForm 通过其构造函数实例化时,其 Activated 事件将触发。但是当子窗体被简单地激活时,子窗体的激活方法不会触发。换句话说,通过它的 Activate 方法激活一个子窗体实际上并没有激活它。微软使用“激活”来表示多个不同的事物。这就是让我感到困惑的原因。

@Dyppl:当父窗体调用子窗体的Activate方法时,父窗体具有焦点。

我希望做的是重用 ReportForm 来显示各种报告。如果它已经打开显示客户列表,比如说,然后用户选择了其他报告,我希望子表单显示其他报告。我希望分配一个自定义的公共 ReportForm.CurrentReport 属性,然后简单地(重新)激活子表单,并让它的激活事件这样做:

     ReportForm_Activate()
         {
             this.reportViewer1.Report = this.CurrentReport;
             this.reportViewer1.RefreshReport();  
          }

【问题讨论】:

  • 在执行f.Activate() 之前,表单是否处于非活动状态?如果它已经处于活动状态,则不会再次“激活”。
  • 在您尝试激活表单时是否可见?
  • 没有复制,这很好用。发布的代码不可能工作,“f”是一个局部变量。
  • @Hans Passant:我将编辑问题以使其更清晰。
  • @Dyppl:当父窗体调用子窗体的Activate方法时,父窗体具有焦点。

标签: .net winforms


【解决方案1】:

当用户(或程序)将窗口置于最前面时(可能通过在其他程序处于活动状态时单击它)引发激活事件。

如果这是活动应用程序,Form.Activate 会将其置于最前面,如果这不是活动应用程序,则它会闪烁窗口标题。 MSDN Form.Activate

【讨论】:

  • 我阅读了该文档,但它没有说明在调用表单的 Activate 方法时是否会触发 Activated 事件。
  • Activated 事件与 WM_ACTIVATE 窗口消息的关系比与 Activate 方法的关系更密切。
  • 要解决您的问题,请考虑将代码从 Activate 移动到一个名为 Reload () 的新方法中。然后Activate可以调用Reload(),MDIParent可以调用Reload()。
【解决方案2】:

如果您在调用Show() 方法之前定义了OnFormActivated 事件处理程序,则该事件处理程序应在加载表单时触发。请考虑以下示例。

在 MyForm 类中,声明以下委托:

public delegate void MyFormActivated(object sender);

回到实例化和加载 MyForm 对象的类:

MyForm myForm = new MyForm();

myForm.OnFormActivated += new myFormActivated(myOnFormActivatedEventHandlerMethod);

myForm.MdiParent = this;  // do this if the parent class is a form
myForm.Show();

事件处理程序需要能够被调用它们的类访问,例如,实例化和加载 MyForm 对象的类。

请注意,如果您在调用Show() 方法后声明事件处理程序,则不会执行事件处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多