举个例子,首先在使用Excel时,当打开多个Excel工作簿时候会发现在任务管理器中,Excel进程始终只有一个:
但是我们编写WPF程序后,反复打开这个程序,会出现很多相同进程:
而且占用内存很大。
下面介绍一个方法来让WPF单开:
我们在WPF项目中添加一个类StartupSingleInstance.cs
让他继承至Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
首先要引用Microsoft.VisualBasic这个COM
详细代码如下(供参考):
class StartupSingleInstance : WindowsFormsApplicationBase
{
public StartupSingleInstance()
{
//设置单实例应用程序
this.IsSingleInstance = true;
}
//定义一个公共的App对象
private App app;
/// <summary>
/// 重写启动事件
/// </summary>
/// <param name="eventArgs"></param>
/// <returns></returns>
protected override bool OnStartup(StartupEventArgs eventArgs)
{
app = new App();
app.Run();
return false;
}
/// <summary>
/// 重写下一个实例启动事件
/// </summary>
/// <param name="eventArgs"></param>
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
{
base.OnStartupNextInstance(eventArgs);
//如果再次启动则只显示窗体
app.ShowWindows();
}
这里的ShowWindows方法可以写在App.xaml.cs里:
public void ShowWindows()
{
MainWindow win = new MainWindow();
win.Show();
}
然后在StartupSingleInstance.cs类里添加主函数
//单线程启动单元
[STAThread()]
public static void Main(string[] args)
{
//启动
StartupSingleInstance startupSingleInstance = new StartupSingleInstance();
startupSingleInstance.Run(args);
}
在App.xaml里也重写OnStartup方法:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
ShowWindows();
}
在解决方案属性里修改启动对象:
然后启动调试。
到Debug里反复打开程序;效果如图: