Winform布局完成后触发事件

时间:2010-01-05 10:02:12

标签: c# winforms events

我正在开发一个C#WinForm应用程序。

一旦表单“显示”并且表单的布局完成,我想触发一些处理。

我正在使用“_Shown”事件,但这似乎在表单布局完成之前触发。布局完成后,是否有可以使用的事件?

7 个答案:

答案 0 :(得分:18)

Application.DoEvents()放在表单的Shown事件处理程序的开头。这将强制渲染所有控件。

答案 1 :(得分:4)

我没有看到显示后你可以用于此目的的事件。您是否可以使用计时器来延迟您在Shown事件中的处理?

答案 2 :(得分:3)

VB6中的一个老技巧曾经是使用Paint事件:

bool firstShown = false;

void form_Paint(Object sender, EventArgs e) {
  if ( !firstShown ) {
    YourMethodThatNeedsToRunOnShown();
    firstShown = true;
  }

  //the rest of your paint method (if any)

}

有点hacky,但确实有效

答案 3 :(得分:2)

这适合我,而且更少" hacky"比其他建议:

protected override void OnLayout(LayoutEventArgs levent)
{
    base.OnLayout(levent);

     if(someControl == null)
       return; // be careful of OnLayout being called multiple times

    // otherwise, do some stuff here, set control sizes, etc.
}

答案 4 :(得分:1)

据我所知,事件顺序类似于

Form.Load
Form.Layout 
Form.VisibleChanged
Form.GotFocus
Form.Activated
Form.Shown

因此,如果在Form.Show之后仍然发生某些事情,那是因为你编码它的方式。

您是否可以动态创建表单?

答案 5 :(得分:0)

尝试使用 Form.GotFocus(从控件继承) 像这样的东西。

   private void Form1_Load(object sender, EventArgs e)
    {
        this.GotFocus += new EventHandler(Form1_gotFocus);
        this.Focus();
    }

    private void Form1_gotFocus(object sender, EventArgs e)
    {
      // You will need to Switch focus from form at the end of this function, 
      //to make sure it doesnt keep Firing.
    }

根据msdn,发生以下情况:

使用键盘(TAB,SHIFT + TAB等)更改焦点时,通过调用Select或SelectNextControl方法,或将ContainerControl .. ::。ActiveControl属性设置为当前表格,焦点事件按以下顺序发生:

  1. 输入
  2. 的GotFocus
  3. 保留
  4. 验证
  5. 验证
  6. LostFocus

答案 6 :(得分:0)

最佳解决方案是Shown()事件:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.shown.aspx

"只有在第一次显示表单时才会显示所显示的事件;随后最小化,最大化,恢复,隐藏,显示或失效和重新绘制将不会引发此事件。"