C# 防止显示一个窗体的多个实例
我正在处理一个应用程序,其中有一个主表单和几个其他表单可以同时使用。当用户单击打开另一个表单时,我希望这样做:如果表单已经打开,则单击该表单的按钮不会再次打开该表单 showDialog无法工作,因为用户仍然需要访问主窗体上的控件 这是我的帮助窗口代码,所有其他表单都以相同的方式打开C# 防止显示一个窗体的多个实例,c#,forms,window,C#,Forms,Window,我正在处理一个应用程序,其中有一个主表单和几个其他表单可以同时使用。当用户单击打开另一个表单时,我希望这样做:如果表单已经打开,则单击该表单的按钮不会再次打开该表单 showDialog无法工作,因为用户仍然需要访问主窗体上的控件 这是我的帮助窗口代码,所有其他表单都以相同的方式打开 private void heToolStripMenuItem_Click(object sender, EventArgs e) { Form help = new he
private void heToolStripMenuItem_Click(object sender, EventArgs e)
{
Form help = new help();
help.Show();
}
根据您希望如何管理,您可以做以下几件事:
试着让你的帮助成为全球性的
private Form help;
private void heToolStripMenuItem_Click(object sender, EventArgs e)
{
if(help == null)
help = new help();
help.Show();
}
使用单例:
class HelpForm : Form
{
private static HelpForm _instance;
public static HelpForm GetInstance()
{
if(_instance == null) _instance = new HelpForm();
return _instance;
}
}
.......
private void heToolStripMenuItem_Click(object sender, EventArgs e)
{
HelpForm form = HelpForm.GetInstance();
if(!form.Visible)
{
form.Show();
}
else
{
form.BringToFront();
}
}
或者,您可以使用应用程序的打开表单查看它是否打开
btn_LaunchHelp(object o, EventArgs e)
{
foreach (Form f in Application.OpenForms)
{
if (f is HelpForm)
{
f.Focus();
return;
}
}
new help().Show();
}
编辑:更清楚地说,这允许用户随时关闭帮助,并且比保存对帮助窗口的引用更易于管理。无需清理,无需维护。您是否考虑过制作MDI表单?这样可以确保父窗体始终可见,并且子窗体包含在父窗体中。然后,您只需浏览表单列表并在其上显示。不需要独裁者(很多人认为这是糟糕的编程实践)。也许会对你有所帮助。
private Form help;
private void heToolStripMenuItem_Click(object sender, EventArgs e)
{
if (help == null || (help != null && help.IsDisposed))
{
help = new Form();
}
if (!help.Visible)
{
help.Show();
}
else
{
help.BringToFront();
}
}
您可以这样进行,在顶部声明这两个变量:
private static readonly object MyLock = new object();
private static Form1 _Instance = null;
之后
public Form1 GetFormInstance
{
get
{
lock (MyLock)
{
if (_Instance == null || _Instance.IsDisposed)
{
_Instance = new Form1();
}
else
{
_Instance.BringToFront();
}
return Form1._Instance;
}
}
}
放入Form1\u FormClosed事件
Form1._Instance = null
按如下方式调用表单后:
Form1.GetFormInstance.Show();
希望它能帮上忙。好吧,这对我来说很有帮助
private static Mutex m_Mutex;
bool IsNew;
m_Mutex = new Mutex(true, Application.ProductName, out IsNew);
if (IsNew)
{
Application.Run(new Form1());
}
有关更好的文档,请参阅下文
关闭表单时将变量_instance设为null将非常完美:)@mlettele您的代码似乎有错误,因为非静态变量不能在静态方法中使用