我有一个应用程序,它将主窗体的内容代码设置为视图(它是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");
}
}
}症状是:InvokeRequired是false。“构造函数”消息没有显示,我只有"Load normal“消息。
此外,如果我注释掉“构造函数”消息框,则根本不会显示任何消息...
据我所知,有没有人能帮上忙?
发布于 2016-05-06 18:05:33
我认为您的构造函数消息框在您的示例中没有显示的原因是,您可能在显示主窗体之前构造了您的控件。在调用主窗体加载事件之前,您的程序无法显示任何内容。
你应该努力保持你的构造器的轻量级:让你的构造器只做它能完全控制的事情,比如创建自己的成员和设置成员的状态。
这样做的原因是,在构造期间,并不是所用控件完全工作所需的一切都已经创建并完全起作用了。因此,与用户界面的第一次交互通常应该在load事件处理程序中完成
由于未知的原因,您希望在施工过程中与操作员进行沟通。我猜这是为了调试目的。为此,请考虑使用Debug类。
如果你真的想告诉操作员一个控件被构造了,你至少应该等到主窗体构造完成。
顺便说一句,您的加载事件处理程序只能由GUI线程调用,因此永远不会需要Invoke,除非您做了一些奇怪的事情,比如直接调用函数。因此,您可以删除对InvokeRequired的检查,或者,如果您不信任自己的代码,则应该使用Debug.Assert(!InvokeRequired)来找出您在哪里不正确地使用了windows窗体。
https://stackoverflow.com/questions/37069207
复制相似问题