点击button1,弹出窗体 frmTemp再次点击,还会再次出现一个新的frmTemp点击N次,出现N次 frmTemp,怎么防止同一个窗体仅出现一次呢?

解决方案 »

  1.   

    表达清楚问题啊同学!什么叫“防止”同一个窗体仅出现一次?
    姑且体会一下你的意思吧,方法很多:
    从设计模式的角度,你可以参考单例模式;
    嫌麻烦,可以用一个Dictionary,Form打开的时候Add,关闭的时候Remove;
    还有一个Application.OpenForms,你可以去遍历查找。
      

  2.   

    关闭事件,修改成hide然后打开事件,进行判断,如果有该实例,则active,否则new
      

  3.   

    1.定义一个bool,判断下状态是否弹出 
    2.frmTemp在函数外面定义,控制frmTemp的hide和show
      

  4.   

    两种方式,一种是用窗体的showdialog,而不用show。
    另一种方式,是预先放一个全局变量,当变量为空时,则创建(new)并打开窗体。如果不为空时,则显示(show)并激活窗体(active)。这种方式,窗体不能close,只能hide。
    这么说明白了吧?
      

  5.   


    定义bool,如何用代码判断 是否弹出呢?
    这个我不知道,我只能选择 Show(); 不能选择 ShowDialoge();
      

  6.   

    frmTemp Temp = new frmTemp();
                if (????)
                {
                    Temp.Activate();
                }
                else
                {
                    Temp.Show();
                }是这样判断frmTemp是否已弹出呢?
      

  7.   

    单例模式 其实就是 检查现在有没有frmtemp的实例,有就返回这个实例,没有才去new一个出来!
      

  8.   


    如何用代码检查现在有没有frmtemp的呢?谢谢
      

  9.   

    楼主应该是用modeless的模式打开窗口,这样的话,只需要保证在父窗口中只声明了一个子窗口的实例对象就可以了。比如:
    Class ParentForm: Form
    {
        private ChildForm _childForm = new ChildForm();
        private void button1_Click(object sender, EventArgs args)
        {
            _childForm.Show();
        }
    }
    这样每次Click都只是把唯一的这个子窗口Show一下而已,即使它已经Show了也没关系。
      

  10.   


    不行呢,连frmTemp窗体也不能弹出来了
      

  11.   


            public Form2 frm;//设置全局变量,假设要打开的窗体为Form2
    /////////////////////以下是具体的打开窗体代码//////////////////////
                if (frm == null || frm.IsDisposed)
                {
                                    frm = new Form2();
                    frm.Visible = true;            }
                else
                {
                    frm.Visible = true;
                }
      

  12.   


    不太明白,能否给出具体的代码呢?谢谢假设窗口名称为Test
    private static Test singleton;
            public static Test Singleton
            {
                get 
                {
                    if (singleton == null)
                    {
                        singleton = new Test();
                    }
                    return singleton;
                }
            }但是,这样用需要修改一下关闭事件
    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
            {
                e.Cancel = true;//取消关闭事件            this.Visibility = Visibility.Hidden;
                singleton = null;        }
    当需要调用这个Test窗口时,直接使用Test.Singleton.Show(),就不需要new新窗口了。用15楼的方法也可行
      

  13.   

       Form2 f2 = null;
            private void button1_Click(object sender, EventArgs e)
            {
                if (f2 != null)
                {
                    return;
                }
                else
                {
                    f2 = new Form2();
                    f2.Show();
                }
            }
      

  14.   

    单例模式,具体方法:(以下所有方法值针对想要出现一次的那个窗体)
    1、将构造函数私有化(把public改成private)
    2、创建本类唯一的一个实例(声明)
    3、使用静态方法,返回唯一的实例
    4、窗体关闭时,将创建的唯一实例清空。(通过formClosing事件来完成)
      

  15.   


    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;using System.Runtime.InteropServices;
    using System.Diagnostics;namespace frmMain
    {
        static class Program
        {
            private const int WS_SHOWNORMAL = 1;
            [DllImport("User32.dll")]
            private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
            [DllImport("User32.dll")]
            private static extern bool SetForegroundWindow(IntPtr hWnd);
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {            Process instance = GetRunningInstance();
                if (instance == null)
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new frmMain());            }            else
                {
                    HandleRunningInstance(instance);
                }
            }        /// <summary>
            /// 获取当前是否具有相同进程。
            /// </summary>
            /// <returns></returns>
            public static Process GetRunningInstance()
            {
                Process current = Process.GetCurrentProcess();
                Process[] processes = Process.GetProcessesByName(current.ProcessName);
                //遍历正在有相同名字运行的例程   
                foreach (Process process in processes)
                {
                    //忽略现有的例程   
                    if (process.Id != current.Id)
                        //确保例程从EXE文件运行 
                        if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
                            return process;
                }
                return null;
            }
            /// <summary>
            /// 激活原有的进程。
            /// </summary>
            /// <param name="instance"></param>
            public static void HandleRunningInstance(Process instance)
            {
                ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
                SetForegroundWindow(instance.MainWindowHandle);
            }    }
    }
      

  16.   


      /// <summary>
            /// 私有的 静态 进行传递到 Main 里
            /// </summary>
            private static OnlyOneForm onlyOneForm = null;
            private static readonly object padlock = new object();
            //私有的
            private OnlyOneForm()
            {
                InitializeComponent();
            }        /// <summary>
            /// 单例方法——共有的
            /// </summary>
            /// <returns></returns>
            public static OnlyOneForm GetInstrance()
            {
                if (onlyOneForm == null)
                {
                    lock (padlock)//双重锁防止多线程安全问题
                    {
                        if (onlyOneForm == null)
                        {
                            onlyOneForm = new OnlyOneForm();
                        }
                    }
                }
                return onlyOneForm;        }
      

  17.   

    一句话,用模态窗口,ShowDialog();
      

  18.   

    就用ShowDialog()。这个是微软内置优化的解决方法。性能也好。
      

  19.   

    6楼的方式可以采取,两种方法都可以,全局变量你点Button的时候判断下,弹出后变量给个值,再点,判断是不是这个值再决定弹窗与否就可以。
      

  20.   

    通过窗口标题来判断
    如果是MDI界面,打开前先遍历整个this.MdiParent.MdiChildren,如果有相同标题的则返回true,this.MdiParent.MdiChildren[i].Activate();无相同的则新建
    如果不是MDI,则你在打开时设定第二窗体为第一个窗体的子窗体newForm.Owner=this;
    打开第二窗体前先判断第一窗体子窗体里是否已有第二窗体,同样可以通过标题来判断
    通过窗体标题来判断的好处是有时候有的窗体会 根据情况 多次按不同功能应用,这样,只要标题不一样就可以再次打开,而标题一样的都是应用相同的,只需要打开一个