C# 单例对话模式
我有一个应用程序,它有一个用户输入对话框。我希望此对话框在任何给定时间只允许打开一次。通常我会通过一个模态对话框来实现这一点,但我需要用户能够在对话框打开时与父窗体交互。我试图通过以下代码实现这一点:C# 单例对话模式,c#,winforms,dialog,singleton,C#,Winforms,Dialog,Singleton,我有一个应用程序,它有一个用户输入对话框。我希望此对话框在任何给定时间只允许打开一次。通常我会通过一个模态对话框来实现这一点,但我需要用户能够在对话框打开时与父窗体交互。我试图通过以下代码实现这一点: private static Boolean dialogShown = false; public Dialog() { if (!dialogShown ) { dialogShown =
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();
}
尝试显示已关闭的窗体时引发异常。它并非总是发生,但很容易重复。所以问题是,做这件事的正确方法是什么,因为我的互斥锁在这里不可靠
我在这里看到了一些其他类似的问题,但在大多数情况下,用例有比对话框更好的解决方案。在这种情况下,它必须是一个非模态的单例对话框
-编辑,我不应该使用单例,因为它会引起一些混乱。我想有一个微妙的区别,我只担心在任何给定的时间都有一个对话框打开,而不关心每次都是同一个实例。我也不应该使用变量名Visible,因为这也有误导性。我编辑了代码以避免这种情况。为这篇误导性的文章道歉…Close()
将处理您的对话框,阻止您重用它。改为调用
Hide()
其他一些注意事项:
- 您不需要事件处理程序
- WinForms是严格的单线程;你不需要任何锁
- 构造函数中的任何逻辑都没有意义