【问题标题】:is it good practice to call .Show() or .ShowDialog inside dialog's constructor在对话框的构造函数中调用 .Show() 或 .ShowDialog 是一种好习惯吗
【发布时间】:2018-07-02 14:04:43
【问题描述】:

调用 .Show() 或 .ShowDialog() 方法作为 WPF 窗口构造函数的最后一行是否是一种好习惯? 唯一的原因是为了简化我的窗口类的使用——通过创建它的一个实例,我已经在显示它了。

【问题讨论】:

  • 绝对不是。构造函数应该只初始化窗口,而不是显示它。有不同的方法可以做到这一点。
  • 谢谢大家,很高兴知道这是一种不好的做法。

标签: c# .net wpf constructor dialog


【解决方案1】:

我会说不好的做法。如果您想创建实例而不显示它们怎么办?

相反,您可以提供一个工厂方法来执行此操作:

public static void ShowMyDialog(string text)
{
    // initialize an instance of this dialog 
    // ... and then show
    instance.ShowDialog();
}

【讨论】:

  • 这更有意义。我的应用程序中的大多数窗口都很简单,我只是创建它们的一个实例,显示并读取实例的输入。通过这种方式也可以达到同样的效果,甚至更好。
【解决方案2】:

在继承的情况下,您建议的方法会严重中断:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        Title = "W 1";
        ShowDialog();
    }
}

public partial class Window2 : Window1
{
    public Window2()
    {
        InitializeComponent();
        Title = "W 2";
    }
}

尝试创建var w = new Window2(); 将阻止Window2 ctor 的执行,直到带有“W 1”标题的模态窗口关闭。 w.ShowDialog() 之后会抛出异常。

在正常情况下,用户可能希望在显示之前设置 Window 的一些属性,例如设置 DataContext。

所以不要打破单一职责原则,让构造函数和 ShowDialog 方法分开工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-01
    • 2021-04-11
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2017-10-11
    • 2014-06-07
    相关资源
    最近更新 更多