首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Winforms ShowDialog未显示

Winforms ShowDialog未显示
EN

Stack Overflow用户
提问于 2016-05-06 17:45:53
回答 1查看 1K关注 0票数 1

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

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

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

我使用以下代码:

代码语言:javascript
复制
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。“构造函数”消息没有显示,我只有"Load normal“消息。

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

据我所知,有没有人能帮上忙?

EN

回答 1

Stack Overflow用户

发布于 2016-05-06 18:05:33

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

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

这样做的原因是,在构造期间,并不是所用控件完全工作所需的一切都已经创建并完全起作用了。因此,与用户界面的第一次交互通常应该在load事件处理程序中完成

由于未知的原因,您希望在施工过程中与操作员进行沟通。我猜这是为了调试目的。为此,请考虑使用Debug类。

如果你真的想告诉操作员一个控件被构造了,你至少应该等到主窗体构造完成。

顺便说一句,您的加载事件处理程序只能由GUI线程调用,因此永远不会需要Invoke,除非您做了一些奇怪的事情,比如直接调用函数。因此,您可以删除对InvokeRequired的检查,或者,如果您不信任自己的代码,则应该使用Debug.Assert(!InvokeRequired)来找出您在哪里不正确地使用了windows窗体。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37069207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档