任何使用过.Net和WinForms做过UI工作的人都非常熟悉这类代码:
TestForm frm = new TestForm();
frm.ShowDialog();
我发现自己希望显示模式对话框的调用不那么冗长,更像是静态调用。还有一种更简单的方法。在一个简单的例子中,您真正需要的是这样的东西:
new TestForm().ShowDialog();
我错过了什么吗?这种速记会有什么影响吗?例如,windows消息未正确处理/路由,对话框的资源未被释放等?
当我看到Ray的反馈时,我正在做这个工作:
我认为一种更简单的方法是用TestForm创建一个静态成员,该成员创建自身的一个实例并在内部调用ShowDialog。所以,这段代码:
public static DialogResult DoModal()
{
return new TestForm().ShowDialog();
}
可以这样调用:
TestForm.DoModal();
发布于 2009-08-11 08:54:49
如果您不想在代码中的任何位置重用form对象,则可以只使用简短的表单
new TestForm().ShowDialog();
如果您想稍后对该对象执行某些操作,则必须将其赋给一个变量。
发布于 2009-08-11 08:55:04
非常简单。隐藏窗体构造函数(将其设为私有),然后添加静态工厂方法,该方法将初始化窗体的新实例并立即显示它。
例如,请参阅MessageBox源代码(如果我没有记错的话,请参阅Mono) link
发布于 2009-08-12 08:12:25
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以外的数据返回给应用程序。这就是为什么标准表单没有静态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;
}
}
但这是非常具体的用例,与您的单行实用程序方法相去甚远。
https://stackoverflow.com/questions/1261624
复制相似问题