任何使用.Net和WinForms完成任何UI工作的人都非常熟悉这类代码:
TestForm frm = new TestForm();
frm.ShowDialog();
我发现自己希望显示模态对话框的调用不那么冗长,更像是静态调用。 Andf有一种更简单的方法。在一个简单的例子中,你真正需要的就是这样:
new TestForm().ShowDialog();
我错过了什么吗?这种速记会不会有任何影响?例如。 Windows消息未正确处理/路由,对话框资源未处理等?
当我看到Ray的反馈时正在研究这个问题:
我想更简单的方法是使用TestForm创建一个静态成员,该成员创建自己的实例并在内部调用ShowDialog。所以,这段代码:
public static DialogResult DoModal()
{
return new TestForm().ShowDialog();
}
可以这样调用:
TestForm.DoModal();
答案 0 :(得分:5)
如果您不想在代码中的任何位置重复使用表单对象,则可以使用简短形式
new TestForm().ShowDialog();
如果您想稍后使用该对象执行某些操作,则必须将其分配给变量。
答案 1 :(得分:2)
非常简单。隐藏表单构造函数(将其设为私有),然后添加静态工厂方法,该方法将初始化表单的新实例并立即显示。
例如,请参阅MessageBox源代码(Mono,如果我没有记错的话) link
答案 2 :(得分:1)
ShowDialog的典型用法应如下所示:
using (Form form = new Form())
{
// here setup your form instance
if (DialogResult.OK == form.ShowDialog())
{
// here read data from form instance
}
}
请注意,ShowDialog()会导致表单实例无法自行处理。一旦完成,您应该手动处理它 - 因此使用子句有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/w61zzfwe.aspx。在您的方案中,这应如下所示:
public static DialogResult DoModal()
{
using (Form form = new TestForm())
return form.ShowDialog();
}
但只有当您不需要从表单实例中读取任何数据时,这才有用。所以适合这里的唯一场景是消息框。 MessageBox.Show(...)方法使用您希望在帖子中实现的模式。
在其他方案中,表单应该在关闭后将DialogResult以外的数据返回给应用程序。这就是标准Form没有静态ShowDialog()或DoModal()方法的原因。静态方法应该配置临时表单实例。这样的处理将无法从表格中读取数据。更重要的是,在静态方法场景中,没有表单实例可以从中读取数据。
总而言之,您的方法符合指南,应该更像:
public static YourResultClass DoModal()
{
using (TestForm form = new TestForm())
if (DislogResult.OK == form.ShowDialog())
{
YourResultClass result = new YourResultClass();
// Here initialize YourResultClass instance with data from form instance
return result;
}
}
但这是特定于用例的,与你的单线实用方法相差甚远。