前面讲了让某个程序只运行一个实例的方法(用到了System.Threading.Mutex),这里讲让程序中某个Form只运行一个实例的方法:
情景是这样的,若在我们编写的某个App中托盘图标的右键弹出菜单选择"设置..."菜单项,就会弹出OptionForm窗口,但是在未关闭OptionForm时,再次点击"设置..."菜单,这时不希望再弹出一个OptionForm窗口了,应该怎么做呢?
我的实现是在 static class Program {... }中加入全局静态布尔变量,供两个不同的窗体设置和检测,进而确保子Form只实例化一个。当然可能还有其他更多更好的方法,但我觉得我的这个方法好理解,实现起来也不难。
//Program类
static class Program
{
public static bool IsOptionFormOpened; //*关键: 全局静态,用于窗口间传值
[STAThread]
static void Main()
{
Application.Run(new FormMain());
}
}
//在FormMain类中
private void 设置OToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!Program.IsOptionFormOpened) //如果为真就不在new FormOption()了
{
formOption = new FormOption();
formOption.Show();
Program.IsOptionFormOpened = true;
}
}
//在FormOption类中
private void FormOption_FormClosed(object sender, FormClosedEventArgs e)
{
Program.IsOptionFormOpened = false;
}
(上例没有实现在FormMain中第二次单击"设置"按钮时,激活FormOption)