2009-07-29 44 views
1

我有一个包含一个文本框的动态加载到窗体的用户控件。 在表单启动时,我启动了usercontrol,并将其可见性标记设置为'false'。 我想在用户控件变得可见时自动触发一个方法,因为此方法将一些输出写入文本框,此方法应该只在usercontrol及其所有继承的控件对用户可见后才开始执行。

我认为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(); 
     } 
+1

你想从更高的水平完成什么?例如,为什么在文本框不可见时向文本框添加文本是不可接受的?让我们帮助您尝试解决实际问题,这可能涉及与您在问题中概述的方法不同的方法。 – Eric 2009-07-29 12:01:18

+0

sich没有真正的问题。但是,如果在文本框行之后添加文本,并且在用户实际看到文本框从一开始就被填满之间存在一定的延迟,那将会很不错。现在,在窗体仍在加载时写入文本框的行只是在完成后立即出现。显然,在'visibleChanged'事件上注册并不能做到这一点。我更期待的是说,一个事件“我做现在载入和处理所有UI事件,你现在可以走了,并添加表格/使用任何控制”。 – Mez 2009-07-29 18:42:03

回答

0

您可以订阅您的控件的VisibleChanged事件或重写OnVisibleChanged。要仅在显示用户控件时调用您的代码,请将post方法调用到控制消息队列中。如果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); 
} 
2

你可以尝试添加文本框初始化代码的处理程序用户控件的输入事件,该事件触发时,控制增益输入焦点,然后在你的代码,激活控制确保您拨打将控件上的焦点方法设置为活动状态。你可能会想要保留一个标志,所以这只在第一次出现控制增益输入焦点时完成。

0

既然你真正想要做的是填补行的文本框中行,我会当VisibleChanged事件被触发建议启动一个定时器。在计时器的滴答事件中,您可以添加一行文字。如果在第一个计时器打勾前需要等待更长时间,则将计时器的延迟设置得更长,然后在第一次通过Tick事件处理程序时将其延迟。

相关问题