Winform布局完成后触发事件

问题描述 投票:0回答:8

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

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

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

c# winforms events
8个回答
21
投票

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


6
投票

在显示您可以用于此目的后,我没有看到任何事件。您不能使用计时器来延迟 Shown 事件中的处理吗?


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,但确实有效


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.
}

1
投票

据我所知,事件顺序是这样的

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

因此,如果在

Form.Show
之后仍然发生某些事情,那是因为您的编码方式所致。

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


1
投票

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

“仅在第一次显示表单时引发 Shown 事件;随后的最小化、最大化、恢复、隐藏、显示或无效和重画不会引发此事件。”


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. 获得焦点
  3. 离开
  4. 验证中
  5. 已验证
  6. 失去焦点

0
投票

试试这个:

private void Form1_Load(object sender, EventArgs e)
{
    Application.Idle += Form1_Loaded;
}

private void Form1_Loaded(object sender, EventArgs e)
{
    Application.Idle -= Form1_Loaded;
    // do the stuf
}
© www.soinside.com 2019 - 2024. All rights reserved.