【问题标题】:How to execute a method after usercontrol is fully visible用户控件完全可见后如何执行方法
【发布时间】:2009-07-29 11:44:39
【问题描述】:

我有一个包含文本框的用户控件,我将其动态加载到表单上。 在表单启动时,我启动用户控件并将其可见性标签设置为“假”。 我想在用户控件变为可见时自动触发一个方法,因为此方法将一些输出写入文本框,此方法应仅在用户控件且其继承的所有控件对用户可见之后才开始执行。

我认为paintEventHandler 应该是在表单及其继承的控件在例如控件的可见性发生更改后重新绘制时触发的最后一个事件。

所以订阅paintEventHandler应该在表单完全重绘后触发我订阅的方法,但显然不是,我的方法在我的文本框仍然隐藏时执行,只有在方法完成执行后才可见。

对此有什么想法吗?

private void processControl_SetActive(object sender, CancelEventArgs e)
        {

            this.BeginInvoke((MethodInvoker)delegate
           {
               this.Paint += new PaintEventHandler(processControl_Paint);
           });

        }

void processControl_Paint(object sender, PaintEventArgs e)
        {
            //Should only be called when everything is fully loaded and visible on the form.
            //Application.DoEvents()  ->probably bad idea??
            AddStuffToTextBox();
        }

【问题讨论】:

  • 你想从更高的层次上完成什么?例如,为什么在文本不可见的情况下将文本添加到文本框中是不可接受的?让我们帮助您尝试解决真正的问题,这可能涉及与您在问题中概述的方法不同的方法。
  • 本身并没有什么问题。但是,如果将文本一行一行地添加到文本框并在其间有一定的延迟,那么用户实际上会看到文本框从一开始就被填满,这将是一件好事。现在,在表单仍在加载时写入文本框的行只会在完成后立即出现。注册 'visibleChanged' 事件显然并不能解决问题。我更多的是寻找一个事件,上面写着“我现在已经完成加载和处理所有 UI 事件,你现在可以去添加/使用表单上的任何控件”。

标签: c# .net winforms


【解决方案1】:

您可以尝试将文本框初始化代码添加到用户控件的 Enter 事件的处理程序中,该事件在控件获得输入焦点时触发,然后在激活控件的代码中确保您在控件将其设置为活动状态。您可能希望保留一个标志,以便仅在控件第一次获得输入焦点时执行此操作。

【讨论】:

    【解决方案2】:

    Guillemaune 在第一次回复时写的应用解决方案!谢谢! 请记住,当对象不可见时不要抛出函数(视情况而定)

    private void Control_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) {
        if (e.Property.ToString().Equals("IsVisible") && (bool)e.NewValue)
            doYourStuffHere();
    }
    

    【讨论】:

      【解决方案3】:

      参见VisibleChanged 事件。

      【讨论】:

      • 在此处查看表单生命周期的链接,在“Paint”事件之前触发了“VisibleChanged”获取,因此这不起作用。 c-sharpcorner.com/UploadFile/mamta_m/…
      • 在您的 UserControl 的可见更改上注册,而不是在 Form.VisibleChanged 上。
      【解决方案4】:

      您可以订阅控件的 VisibleChanged 事件或覆盖 OnVisibleChanged。要仅在显示用户控件时调用您的代码,请将方法调用发布到控制消息队列中。如果 VisibleChanged 在您的情况下失败,您也可以尝试使用 Paint 事件,但我不这么认为。顺便说一句,你为什么要通过 BeginInvoke 添加事件?

      void OnVisibleChanged(EventArgs e)
      {
          //Should only be called when everything is fully loaded and visible on the form.
          //Application.DoEvents()  -> actually bad idea!!
          if (IsHandleCreated)
              BeginInvoke(new MethodInvoker(AddStuffToTextBox));
          base.OnVisibleChanged(e);
      }
      

      【讨论】:

        【解决方案5】:

        由于您真正想做的是逐行填充文本框,因此我建议您在触发 VisibleChanged 事件时启动一个计时器。在计时器的 Tick 事件中,可以添加一行文本。如果您需要在第一个计时器滴答之前等待更长时间,则将计时器的延迟设置得更长,然后通过 Tick 事件处理程序第一次减少它。

        【讨论】:

          猜你喜欢
          • 2011-05-22
          • 2018-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-29
          • 1970-01-01
          相关资源
          最近更新 更多