我看了一下,传统的是用单例模式,或者用判断窗体状态的方法来实现,我想了一下,觉得这样的话每个窗体都要写一次实现单例模式的代码,然后我就想用一个窗体工厂,在里面控制所有窗体的生成方式。

解决方案 »

  1.   


    可以通过Form.Disposed事件来移除静态成员,这些工作可以在类的内部完成,对于外部程序来说根本不用管。
      

  2.   

    为啥不考虑使用HMutex互斥体呢?
      

  3.   

    呃,我到目前为止,只用这一个方法:
    在需要打开的Form2的上级Form1中添加:
    public static bool Form2Open = false;
    然后需要打开的Form2的初始化里,添加Form1.Form2Open = true;
    在关闭Form2的Closing事件里,添加Form1.Form2Open = false;
    最后在Form1中的打开Form2的Button按钮或者其他打开方式的Click或者Open事件中加入判断:
    if(FForm2Open == false)
    {
    //打开Form2
    }
    else
    {
    //报错代码
    }
      

  4.   

            FormB fb = null;
            private void button1_Click(object sender, EventArgs e)
            {
                if (fb == null || fb.IsDisposed)
                {
                    fb = new FormB();
                    fb.Show();
                }
                else
                {
                    fb.Activate();
                }            
            }
      

  5.   

    我是这么干的/// <summary>
            /// 检查当前窗口是否已经存在
            /// </summary>
            /// <param name="TitleText">窗口标题</param>
            /// <returns></returns>
            private bool FormExists(string TitleText)
            {
                for (int i = 0; i < this.xafTabbedMdiManager.Pages.Count; i++)
                {
                    if (this.xafTabbedMdiManager.Pages[i].Text == TitleText)
                    {
                        //激活窗口
                        this.xafTabbedMdiManager.Pages[i].MdiChild.Activate();
                        return true;
                    }
                }
                return false;
            }
      

  6.   


        /// <summary>
        /// 这个类是用来产生窗体
        /// </summary>
        public class FormsFactory
        {
            private FormsFactory() { }        //单例模式
            private static object _lock = new object();
            private static FormsFactory fac = null;
            public static FormsFactory GetInstance()
            {
                if (fac == null)
                {
                    lock (_lock)
                    {
                        if (fac == null)
                        {
                            fac = new FormsFactory();
                        }
                    }
                }
                return fac;
            }        private Hashtable ListForms = new Hashtable(4);        public object GetForms(string frmName)
            {
                object result = null;
                if (this.ListForms.Contains(frmName) && (this.ListForms[frmName] as Form).IsDisposed)
                {
                    this.ListForms.Remove(frmName);
                }            if (this.ListForms.Contains(frmName))
                {
                    result = this.ListForms[frmName];
                }
                else
                {
                    result = Assembly.Load("UI").CreateInstance("UI.Sub." + frmName);
                    this.ListForms.Add(frmName, result);
                }
                return result;
            }
        }调用:
            private void S001003_Click(object sender, EventArgs e)
            {
                Sub.S001003 frm = FormsFactory.GetInstance().GetForms("S001003") as Sub.S001003;
                frm.MdiParent = this;
                frm.Show();
                frm.WindowState = FormWindowState.Maximized;
                frm.Activate();
            }
    大家看看这样有没有问题。
      

  7.   

    private Hashtable ListForms = new Hashtable(4);有问题,每调用一次new一次,不能限制打开窗体吧!
      

  8.   

    /// <summary>
        /// 这个类是用来产生窗体
        /// </summary>
        public class FormsFactory
        {
            private FormsFactory() { }
            //单例模式
            private static object _lock = new object();
            private static FormsFactory fac = null;
            public static FormsFactory GetInstance()
            {
                if (fac == null)
                {
                    lock (_lock)
                    {
                        if (fac == null)
                        {
                            fac = new FormsFactory();
                        }
                    }
                }
                return fac;
            }        private Hashtable ListForms = new Hashtable(4);
            public object GetForms(string frmName)
            {
                object result = null;
                //假如有该窗体,且已释放
                if (this.ListForms.Contains(frmName) && (this.ListForms[frmName] as Form).IsDisposed)
                {
                    this.ListForms.Remove(frmName);
                }            //假如有该窗体,且未释放
                if (this.ListForms.Contains(frmName) && (this.ListForms[frmName] as Form).IsDisposed==false)
                {
                    return null;
                }
                else//没有该窗体,且未释放
                {
                    result = Assembly.Load("ConsoleApplication1").CreateInstance("ConsoleApplication1." + frmName);
                    this.ListForms.Add(frmName, result);
                }
                return result;
            }
        }调用  Form frm=FormsFactory.GetInstance().GetForms("Childform") as Form;
                if (frm == null)
                    return;
                Childform chil = frm as Childform;
                chil.Callevent += (send) =>
                   {
                       textBox1.Text = send;
                   }; chil.Show();