您的位置:首页 > 移动开发

WPF程序单一实例启动问题

2011-05-01 16:38 302 查看
最近在学着写wpf , 做界面确实会漂亮很多。

前不久用wpf 写了一个自己的便签,想让程序只能启动一个实例

但是发现在传统winform里可以自己写代码实现的东西wpf却有点困难

因为系统自动帮你完成了启动这个功能

如果在Application.Startup事件 加入一个全局变量 如mutex来判断

也是可以的

但是已存在实例与新实例时间将无法进行通信(虽然有时候程序并不需要进行同学你)

后来找到一种比较好的方法

就是用WindowsFormsApplicationBase的windows窗口内置支持(这都源于vb。。)

 

下面是代码(WindowsFormsApplicationBase在Microsoft.VisualBasic.ApplicationServices命名空间下)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Windows.Controls;
using System.Windows.Shapes;

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace Note_v_2._0
{
    public class WpfApp : System.Windows.Application
    {
        public MainWindow mainWin;
        protected override void OnStartup(System.Windows.StartupEventArgs e)
        {
            base.OnStartup(e);
            mainWin = new MainWindow();
            //mainWin.Show();
        }
        public void show()
        {
           
            //if (this.mainWin.WindowState == System.Windows.WindowState.Minimized)
            //    this.mainWin.WindowState = System.Windows.WindowState.Normal;
            //this.mainWin.Activate();
        }
    }
    public class SingleInstanceApplicationWrepper :
        Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
    {
        public SingleInstanceApplicationWrepper()
        {
            this.IsSingleInstance = true;
        }
        private WpfApp app;
        protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
        {
            app = new WpfApp();
            app.Run();
            return false;
            //return base.OnStartup(eventArgs);
        }
        protected override void OnStartupNextInstance(Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs eventArgs)
        {
            MessageBox.Show("便签已经打开!");
            //base.OnStartupNextInstance(eventArgs);
            //app.show();
            //if (app.mainWin.WindowState == System.Windows.WindowState.Minimized)
            //    app.mainWin.WindowState = System.Windows.WindowState.Normal;
            //app.mainWin.Activate();
        }
    }
    public class Startup
    {
        [STAThread]
        public static void Main(string[] args)
        {
            SingleInstanceApplicationWrepper wrapper = new SingleInstanceApplicationWrepper();
            wrapper.Run(args);
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐