Winforms ShowDialog没有显示

时间:2016-05-06 09:45:53

标签: c# messagebox ui-thread

我有一个应用程序将主窗体的内容代码设置为视图(它是UserControl的后代)。

现在,在我的一个控件中,我想在创建它时或显示它时显示一个消息对话框(即在构造函数或Load方法中)。

奇怪的是,MessageBox.Show()并没有像我期望的那样显示......

我使用以下代码:

public myControl() {
    InitializeComponent();
    Load += control_load;
    MessageBox.Show("constructor");
}

void control_load(object sender, EventArgs e) {
  if (MainForm.Instance.InvokeRequired) {
      MainForm.Instance.Invoke((Action)delegate {
        MessageBox.Show("Load invoke");
      });
      return;
    }
    else {
      MessageBox.Show("Load normal");
    }
  }
}

症状是:InvokeRequiredfalse。 “构造函数”消息未显示,我只有“加载正常”消息。

此外,如果我注释掉“构造函数”消息框,则根本不会显示任何消息...

为了我的一般理解,有人可以提供帮助吗?

1 个答案:

答案 0 :(得分:1)

我认为你的构造函数消息框没有显示的原因是,因为你可能在显示主窗体之前构造你的控件。在调用主表单加载事件之前,您的程序无法显示任何内容。

你应该努力保持你的构造函数轻量级:让你的构造函数只做它可以完全控制的事情,比如创建自己的成员并设置成员的状态。

原因在于,在构造过程中,并未完全使用所使用的控件所需的所有内容并且功能完全正常。因此,通常第一次与用户界面的交互应该在加载事件处理程序

中完成

由于未知原因,您希望在施工期间与操作员沟通。我想这是出于调试目的。考虑使用Debug类。

如果你真的想告诉操作员构造一个Control,你应该等到至少构造一个主窗体。

顺便说一下,加载事件处理程序只能由GUI线程调用,因此永远不需要Invoke,除非你做一些奇怪的事情,比如直接调用函数。因此,您可以删除对InvokeRequired的检查,或者如果您不相信自己的代码,则应该调试(!InvokeRequired)以找出错误使用Windows窗体的位置。