none
wpf只运行一个实例 RRS feed

  • 问题

  • 我知道在winform下,只运行一个实例只需这样就可以:

    1. 首先要添加如下的namespace:

    using System.Threading;

     

    2. 修改系统Main函数,大致如下:

            bool bCreatedNew;      

            //Create a new mutex using specific mutex name

            Mutex m =new Mutex( false, "myUniqueName", out bCreatedNew );

            if( bCreatedNew )

                Application.Run(new yourFormName());

    在wpf中如何做呢?


    勿以恶小而为之,勿以善小而不为
    2009年10月30日 12:05

答案

  • 首先 引用Microsoft.VisualBasic
    然后新建一个类 single
       public  class single:Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
        {
           App a;
           public single()
           {
               this.IsSingleInstance = true;
           }
           protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
           {
               a = new App();
               a.InitializeComponent();
               a.Run();
               return false;
           }
           protected override void OnStartupNextInstance(Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs eventArgs)
           {
               base.OnStartupNextInstance(eventArgs);
               a.activate();
           }
        }
    
    app.cs
        public partial class App : Application
        {
            protected override void OnStartup(StartupEventArgs e)
            {
                base.OnStartup(e);
                Window1 w = new Window1();
                w.Show();
            }
            public void activate()
            {
                MainWindow.Activate();
            }
            private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e)
            {
            
            }
            private void Application_Startup(object sender, StartupEventArgs e)
            {
              
            }
            private void Application_Exit(object sender, ExitEventArgs e)
            {
        
            }
        }
    app.g.cs
            [System.STAThreadAttribute()]
            [System.Diagnostics.DebuggerNonUserCodeAttribute()]
            public static void Main(string [] a ) {
                single s = new single();
                s.Run(a);   
            }

     

    • 已标记为答案 dut60 2009年11月1日 9:45
    2009年10月31日 5:29

全部回复

  • 首先 引用Microsoft.VisualBasic
    然后新建一个类 single
       public  class single:Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
        {
           App a;
           public single()
           {
               this.IsSingleInstance = true;
           }
           protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
           {
               a = new App();
               a.InitializeComponent();
               a.Run();
               return false;
           }
           protected override void OnStartupNextInstance(Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs eventArgs)
           {
               base.OnStartupNextInstance(eventArgs);
               a.activate();
           }
        }
    
    app.cs
        public partial class App : Application
        {
            protected override void OnStartup(StartupEventArgs e)
            {
                base.OnStartup(e);
                Window1 w = new Window1();
                w.Show();
            }
            public void activate()
            {
                MainWindow.Activate();
            }
            private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e)
            {
            
            }
            private void Application_Startup(object sender, StartupEventArgs e)
            {
              
            }
            private void Application_Exit(object sender, ExitEventArgs e)
            {
        
            }
        }
    app.g.cs
            [System.STAThreadAttribute()]
            [System.Diagnostics.DebuggerNonUserCodeAttribute()]
            public static void Main(string [] a ) {
                single s = new single();
                s.Run(a);   
            }

     

    • 已标记为答案 dut60 2009年11月1日 9:45
    2009年10月31日 5:29
  • 谢谢您的回答。我按照您的方法,现在每次点击运行,他都会同时出现两个窗口,也就是同时运行了两个一样的程序。然后再运行,不会有新窗口打开。所以,您的方法里面是不是让窗体run了两次?
    勿以恶小而为之,勿以善小而不为
    2009年10月31日 12:51
  • 你没有去掉 app.xaml中StartupUri属性造成的
    2009年10月31日 12:55
  • 哦。原来是这样。又试验了一把,果然如此。呵呵。谢谢啦!
    勿以恶小而为之,勿以善小而不为
    2009年11月1日 9:45
  • app.g.cs
            [System.STAThreadAttribute()]
            [System.Diagnostics.DebuggerNonUserCodeAttribute()]
            public static void Main(string [] a ) {
                single s = new single();
                s.Run(a);  
            }

    请问我改了这段代码,重新生成解决方案之后,它又重新变为了原来的代码,覆盖掉了我改的,  这个问题如何解决啊 。。。。谢谢

    2011年9月22日 1:40