本节主要介绍一下Application类的部分功能,咱们首先来看一下如何使用Application类来加载一个窗口:html
咱们首先建立一个控制台程序,并引入相关的dll,而后修改Main()方法。windows
[STAThread] private static void Main() { var app = new Application(); var win = new Window1(); app.Run(win); //另外一种方法建立一个主窗口并显示 //var app = new Application(); //var window1 = new Window1(); //app.MainWindow = window1; //window1.Show(); //app.Run(); Console.WriteLine("Window1 Closed"); }
该示例中用了两种方法经过Application类来加载窗口。该窗口会被做为主窗口显示。当代码执行Run()方法的时候,会触发Application.StartUp事件,该事件执行完以后才显示主窗口。无论是用上面的那种方法,应用程序一直运行,直到主窗口和其余全部窗口都关闭,Run()方法才返回,并在应用程序结束以前,执行Run()方法后面的代码。app
下面咱们来介绍一下常规的WPF应用程序,而且主要也使用这种方法。 ide
咱们在用Visual Studio建立WPF应用程序的时候,能够使用它提供的WPF Application模板。它会为咱们建立一个App.xaml和App.xaml.cs文件。咱们查看App.xaml文件,会发现有一个StartupUri="MainWindow.xaml",它的含义是指定程序的主窗口;在程序自动生成的文件App.g.i.cs中,会用到这个值,它是一个URI格式的值。咱们再查看代码隐藏文件App.xaml.cs,发现只有一个继承自System.Windows.Application的App部分类。ui
最初,App类是没有包含任何代码的。可是咱们能够添加代码来处理应用程序事件,接下来咱们来看看Application类中几个重要的事件:spa
Startup:在Application.Run()方法以后,显示主窗体以前发生。还能够用这个事件的StartupEventArgs.Args属性,获取程序集命令行参数。甚至还能够在该事件里面建立和显示主窗口,而不适用App.XAML中的StartupUri。操作系统
Exit:该事件发生在应用程序关闭以前,不能撤销(无论是何种缘由关闭:调用Shutdown方法、Windows用户注销或者关闭结束回话等)。命令行
SessionEnding:发生,当用户在注销或关闭操做系统关闭 Windows 会话。能够经过检查SessionEndingCancelEventArgs.ReasonSessionEnding属性值来明确缘由。若是要防止应用程序关闭,能够设置SessionEndingCancelEventArgs.Cancel属性值为true(默认为false)。code
Activated:当应用程序的一个窗口被激活的时候发生(包括:启动主窗口的时候;对应用程序的用户切换经过使用 ALT+TAB 或使用任务管理器;用户单击某一的任务栏按钮在应用程序的窗口)。orm
Deactivated:当应用程序的一个窗口被取消激活的时候发生。
DispatcherUnhandledException:在应用程序中的任何位置,只要发生一个任何未处理的异常,就会发生该事件。咱们甚至能够在该事件中使用DispatcherUnhandledExceptionEventArgs.Handled属性,并设置为true(默认为false),让程序继续运行。
有2中选择用于处理事件:经过App.xaml关联事件处理程序;或者直接经过重写相应的受保护的方法。
我还能够经过ShutdownMode改变应用程序的关闭方式,有如下三种方式:
OnLastWindowClose:应用程序关闭时,或最后一个窗口关闭时关闭,或者Shutdown()方法调用。这是默认的行为。
OnMainWindowClose:应用程序关闭时,或主窗口关闭时关闭,或者Shutdown()方法调用。
OnExplicitShutdown:仅当Shutdown()方法调用时,应用程序关闭。在此模式下,若是不调用Shutdown()方法,应用程序一直都不会结束(即便全部窗口都已经关闭)。
咱们已经对WPF的Application类已经有了必定的了解,接下来咱们看看其余一些状况:
访问当前Application对象:经过静态的Application.Current属性,能够在应用程序的任何位置获取当前应用程序实例。
var app = Application.Current; var main = (MainWindow)app.MainWindow;//转换为正确的窗口类型 foreach (var window in app.Windows) { }
这个例子中须要注意的一点就是:Application.Current.Windows这个属性的值是。当窗口(包括主窗口)显示时,它们会被添加到Windows集合中;而当窗口关闭的时候,会从Windows集合中移除该窗口。
单实例应用程序:
一般,只要愿意,咱们就能够加载WPF应用程序的任意多个副本。在某些状况下,这是很是合理的。可是在另一些状况下,这多是一个问题。咱们能够先来看一篇文章,而后再来看一个具体的例子:
1.咱们首先建立一个WPF应用程序,而后删除掉App.xaml文件和其代码后置文件
2.项目添加Microsoft.VisualBasic.dll文件引用
3.建立一个名为App的类文件,并让该App类继承System.Windows.Application
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var main = new MainWindow(); main.Show(); }
4.建立一个名为SingleInstanceApplicationWrapper的类文件,并让该类继承Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
public class SingleInstanceApplicationWrapper : WindowsFormsApplicationBase { /// <summary> /// WPF App /// </summary> private App _app; public SingleInstanceApplicationWrapper() { IsSingleInstance = true; } protected override bool OnStartup(StartupEventArgs eventArgs) { base.OnStartup(eventArgs); _app = new App(); _app.Run(); return false;//这里必定要返回false,指示应用程序是否应继续启动。 } }
5.接下来咱们就须要建立一个程序入口文件Program.cs
public class Program { [STAThread] public static void Main(string[] args) { var single = new SingleInstanceApplicationWrapper(); single.Run(args); } }
这样,咱们一个简单的只能运行单实例的应用程序就建立成功了。接下来基于上面的代码,构建基于文档的应用程序。
6.建立一个读取文档的窗口Document.xaml,用于显示读取文档的内容:
/// <summary> /// Interaction logic for Document.xaml /// </summary> public partial class Document : Window { public Document() { InitializeComponent(); } private DocumentReference _docRef; public void LoadFile(DocumentReference docRef) { _docRef = docRef; Content = File.ReadAllText(docRef.Name); Title = docRef.Name; } protected override void OnClosed(EventArgs e) { base.OnClosed(e); ((App)Application.Current).Documents.Remove(_docRef); } }
7.建立一个实体类DocumentReference,用于MainWindow.xaml的ListBox控件绑定数据源
public class DocumentReference { public DocumentReference(Document document, string name) { Document = document; Name = name; } public Document Document { get; set; } public string Name { get; set; } }
咱们编辑Solution的Properties,修改Debug选项卡的Command line arguments,若是多个参数须要空格。
这样咱们运行程序的时候,就会自动的打开文档了。还须要注意的一点就是把项目中的全部.testDoc文档Copy to Output Directory修改成,Copy always。