有时需要多次弹出一个窗体,但是窗体较为复杂弹出缓慢,下方的单例模式实现则较好的解决了这个问题,好处是窗体是静态的,仅构造一次,第二次弹出的时候相对比较快
实现方法如下:
1 using System; 2 using System.Windows.Forms; 3 4 namespace SingleFormDemo 5 { 6 public partial class PopForm : Form 7 { 8 private PopForm() 9 { 10 InitializeComponent(); 11 } 12 13 private static PopForm _instance; 14 15 //窗体静态单例方法 16 public static PopForm Singleton() 17 { 18 return _instance ?? (_instance = new PopForm()); 19 } 20 21 private void button1_Click(object sender, EventArgs e) 22 { 23 this.Close(); 24 25 } 26 //窗体正在关闭 27 private void PopForm_FormClosing(object sender, FormClosingEventArgs e) 28 { 29 _instance = null; 30 } 31 32 } 33 }
主窗体调用代码
1 private void button1_Click(object sender, EventArgs e) 2 { 3 PopForm.Singleton(); 4 PopForm.Singleton().ShowDialog(); 5 }
实现完了总是感觉怪怪的,调用的时候是一个方法返回的,我们可以让他看起来像一个静态类一样,嗯,看起来像,我们又想更新它部分的属性(下方更新Label的Text),那么代码如下:
using System; using System.Windows.Forms; namespace SingleFormDemo { public sealed partial class PopForm : Form { private PopForm() { InitializeComponent(); } private static PopForm _instance; public static PopForm Instance { get { return _instance ?? (_instance = new PopForm()); } } public string LabelText { set { Instance.label1.Text = value; } } private void button1_Click(object sender, EventArgs e) { this.Close(); } //窗体正在关闭 private void PopForm_FormClosing(object sender, FormClosingEventArgs e) { _instance = null; } } }
调用如下;
private void button1_Click(object sender, EventArgs e) { PopForm.Instance.LabelText = DateTime.Now.ToString(); PopForm.Instance.ShowDialog(); }
OK,这下看起来好多了
如果需要更进阶的了解单例模式,请看单例模式(Singleton)的6种实现