代码之家  ›  专栏  ›  技术社区  ›  Paul Sasik

对速记对话显示有任何影响吗?

  •  3
  • Paul Sasik  · 技术社区  · 16 年前

    任何使用.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();
    
    3 回复  |  直到 11 年前
        1
  •  5
  •   RaYell    16 年前

    如果您不想在代码中的任何地方重用表单对象,您只需使用短表单

    new TestForm().ShowDialog();
    

    如果以后要对该对象执行某些操作,则必须将其赋给变量。

        2
  •  2
  •   Ray    16 年前

    很简单。隐藏表单构造函数(使其成为私有的),然后添加静态工厂方法,该方法将初始化表单的新实例并立即显示。

    例如,请参阅MessageBox源代码(Mono,如果我没有弄错的话) link

        3
  •  1
  •   Przemaas    16 年前

    ShowDialog的典型用法如下:

    using (Form form = new Form())
    {
        // here setup your form instance
    
        if (DialogResult.OK == form.ShowDialog())
        {
            // here read data from form instance
        }
    }
    

    请注意,ShowDialog()导致表单实例无法自行释放。一旦完成处理,就应该手动处理它-因此using子句请参见 http://msdn.microsoft.com/en-us/library/w61zzfwe.aspx 详情。在您的场景中,应该如下所示:

    public static DialogResult DoModal()
    {
        using (Form form = new TestForm())
            return form.ShowDialog();
    }
    

    但只有当您不需要从表单实例中读取任何数据时,这才有用。所以这里唯一适合的场景是消息框。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;
        }
    }
    

    但这是非常特定于用例的,与单行实用程序方法相差甚远。

    推荐文章