【问题标题】:Wait until form is finished loading等到表单完成加载
【发布时间】:2013-09-07 17:02:36
【问题描述】:

是否有某种布尔值可用于检查表单实例是否已加载,或者等到表单加载完毕?

例如:

While(form_loaded == false) {
  Try {
    //do something
  }
  catch {
  }//do try catch so code won't barf
}

我不断收到以下异常:

System.Windows.Forms.dll 中发生了“System.InvalidOperationException”类型的第一次机会异常

System.Windows.Forms.dll 中出现“System.InvalidOperationException”类型的未处理异常

附加信息:在创建窗口句柄之前,无法在控件上调用 InvokeBeginInvoke

这正是我担心的。

另外,如果需要更详细的解释,我可以尝试发布一些代码和/或更多输出调试信息。

【问题讨论】:

  • 您的代码不会针对任何 C# 编译器进行编译(我知道这是示例/伪代码,但这不是重点。)
  • 只要使用Form_Shown
  • 你需要反过来做。在表单的 Load 事件触发之前不要启动线程。

标签: c# winforms


【解决方案1】:

尝试使用类似这样的显示事件

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Shown += new System.EventHandler(this.Form1_Shown);
    }

    private void Form1_Shown(object sender, EventArgs e)
    {

    }
}

希望对你有所帮助

【讨论】:

  • 一般情况下,事件应该在设计器中订阅/委托。
【解决方案2】:

表单完全加载后触发的第一个事件是Shown 事件。使用它...


根据MSDN,事件顺序是:

应用程序启动时:

  • Control.HandleCreated
  • Control.BindingContextChanged
  • Form.Load
  • Control.VisibleChanged
  • Form.Activated
  • Form.Shown

应用程序关闭时:

  • Form.Closing
  • Form.FormClosing
  • Form.Closed
  • Form.FormClosed
  • Form.Deactivate

正如@Henk Holterman 在他的回答中所说,不要在事件驱动的形式中使用忙等待......

【讨论】:

    【解决方案3】:

    您有一个Loaded 和一个Shown 事件可供选择。

    Windows 是事件驱动的,所以永远不要在循环中等待。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 2011-06-03
      • 1970-01-01
      • 2015-08-11
      • 2016-08-15
      相关资源
      最近更新 更多