今天winform开发时,有一个需求:点击一个button,弹出一个窗体,显示相关信息,此时再点击button,就不再创建窗体,这里有两种方式解决:
- 弹出窗体不关闭,无法操作主窗体
使用单例模式
这里使用第二种方法:单例模式(详见百度)
具体代码如下:
public partial class About : Form
{
public static About instance { get; set; }
private About()
{
InitializeComponent();
}
public static About GetInstance()
{
if (instance == null)
{
instance = new About();
}
return instance;
}
}
调用
About about=About.GetInstance();
about.Show();
这样就实现了同时只能打开一个窗体,又能同时操作其他窗体。
But,实际操作之后,会出现这个错误:
这是因为在关闭窗体后,这个对象虽然可能还没被GC回收,但是IsDisposed已经被置为true,已经被视为释放了,这就造成无法访问。
这时可以通过监听Disposed事件来重新分配对象内存。
代码:
public partial class About : Form
{
public static About instance { get; set; }
private About()
{
InitializeComponent();
}
public static About GetInstance()
{
if (instance == null)
{
instance = new About();
}
instance.Disposed+=new EventHandler(instance_Disposed);
return instance;
}
static void instance_Disposed(object sender,EventArgs e)
{
instance = null;
}
}