单身对话模式

时间:2014-12-29 20:57:03

标签: c# winforms dialog singleton

我有一个应用程序,它有一个用户输入对话框。我希望这个对话框只允许在任何给定时间打开一次。通常我会通过模态对话框来实现这一点,但我需要用户能够在对话框打开时与父表单进行交互。我试图通过这样的代码实现这一点:

    private static Boolean dialogShown = false;
    public Dialog()
    {
            if (!dialogShown )
            {
                dialogShown = true;
                InitializeComponent();
            }
            else
            {
                this.Close();
            }
    }

    private void Dialog_Closed(object sender, EventArgs e)
    {
            dialogShown = false;
    }

这个问题在于构造这个形式IE的代码是可能的

    public void ShowDialog()
    {
        Dialog dialog = new Dialog();
        dialog.Show();
    }

在尝试显示已关闭的表单时抛出异常。它不会一直发生,但很容易重复。所以问题是,这样做的正确方法是什么,因为我的互斥锁在这里不可靠。

我在这里看到了一些其他类似的问题,但在大多数情况下,对于用例而言,除了对话之外,还有更好的解决方案。在这种情况下,它必须是非模态单例对话框。

-Edit,我不应该使用Singleton,因为它引起了一些混乱。我认为有一个微妙的区别,我只担心在任何给定的时间都会打开这个对话框的单个实例,并且每次都不关心它是同一个实例。我也不应该使用变量名称Visible,因为这也是误导性的。我编辑了代码以避免这种情况。为误导性的帖子道歉...

1 个答案:

答案 0 :(得分:2)

Close()会丢弃您的对话框,阻止您重复使用它 请改为呼叫Hide()

其他一些说明:

  • 您不需要事件处理程序
  • WinForms严格是单线程的;你不需要任何锁
  • 构造函数中的逻辑都没有意义。