C# Winform应用防止重复打开同一窗体

        在Winform应用程序中,显示窗体的方法有两种方法:第一种,Show()方法,这种方法当点击多次按钮的时候会显示多个当前的窗体,造成操作不便。第二种,ShowDialog()方法,这种方法显示出窗体之后,只能对当前窗体进行操作直到这个窗体关闭之后,用户体验不好。那怎样才能只产生一个窗体,而且不影响对其他窗体的操作?解决这样的问题最简单的想法就是如果每次单击按钮都使用相同的实例化对象,就只能产生一个窗体了,再使用Show()方法显示窗体就不会影响其他窗体的操作了。

如图,实现这样一个小功能,不管点击多少次这个分区设置,只弹出一个子窗体,在子窗体最小化后,点“分区设置按钮”,可以把最小化的子窗口继续打开,具体如下:

网上有很多教程用单列模式(问题来了,假如说我有很多的窗体都要使用单例模式,难道我都要把每个窗体的代码都要修改成那个样子吗,假如窗体多的话,这种方式就会变得很麻烦,那有没有一种简单的方式,能让我们不管增加多少窗体都能很简单的实现我们想要的功能呢?),下面用一个泛型类代替单列模式代码。代码如下:

 public class GenericSingleton<T> where T : Form, new()
        {
            private static T t = null;
            public static T CreateInstrance()
            {
                if (t == null || t.IsDisposed)
                {
                    t = new T();
                }
                else
                {
                    t.Activate(); //如果已经打开过就让其获得焦点  
                    t.WindowState = FormWindowState.Normal;//使Form恢复正常窗体大小
                }
                return t;
            }
        }

泛型代码已经写好了,怎么在事件中调用呢,具体调用如下:

private void 分区设置ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 f2 = GenericSingleton<Form2>.CreateInstrance();
            f2.Show();
        }

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值