Application应用程序生命周期
应用程序的关闭方式------可以在App.xaml文件中设置应用程序的状态,默认 Application.ShutdownMode = OnLastWindowClose
注意的是:如果设置为OnMainWindowClose 当关闭主窗口时候,那么Application对象将在Run方法返回前自动关闭其他窗口,如果调用Application.Shutdown方法也会关闭其他窗口
7.1.4 应用程序事件
App.xaml.cs当中未包含任何代码,但是可以添加代码来处理一些应用程序事件
StartUP():该事件在调用Application.Run()方法之后,并且在主窗口显示之前发生,可以通过此事件来检测应用程序参数,或是显示不同的窗口
Exit():该事件在应用程序关闭时,并在Run()方法即将返回之前发生,这时不能取消关闭,
SessionEnding(): 该事件在Windows对话结束时发生,当用户注销或关闭计算机时会触发,可以通过SessionEndingEventArgs.Canel属性设置为true来取消关闭,否则事件处理程序结束后将调用Application.Shutdown()方法
Activated():应用程序第一个窗口被激活时,或者是从另一个windows程序切换到当前应用程序时触发此事件
Deactivated():应用程序取消激活,或是从当前应用程序切换到其他应用时
DispatcherUnhandleException():在应用程序内部(主应用程序线程)中的任何位置,发生未处理的异常,就会触发该事件,通过此事件可以记录异常发生的原因,如果应用程序仍然处于可以运行状态,可以设置
DispatcherUnhandleExceptionEventArgs.Handle属性为true来继续运行程序
xaml中的代码 <Application x:Class="WpfChapter7.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfChapter7" StartupUri="MainWindow.xaml" DispatcherUnhandledException="Application_DispatcherUnhandledException"> <Application.Resources> </Application.Resources> </Application> 文件中的代码 private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { e.Handled = true; MessageBox.Show("全局异常捕获" + e.ToString() + e.Exception.ToString()); }
7.2 Application的任务
7.2.1 显示初始界面
当应用程序初始化过程过长,或者加载的文件较多,避免用户在等待的过程中,多次点击运行程序,可以通过以下方式 设置一个简单的wpf启动界面,以下示例,线程休眠5秒来模拟程序加载
protected override void OnStartup(StartupEventArgs e) { SplashScreen splashScreen = new SplashScreen("test.jpg"); splashScreen.Show(true); Thread.Sleep(5000); base.OnStartup(e); }
7.2.2 访问当前Application对象
在wpf应用程序中的任意地方,都可以通过Application.Current来获取当前应用程序对象,以及进行一些操作
例如:获取主窗口 Window MainWindow = Application.Current.MainWindow;
获取当前程序所有引用的窗口集合 Application.Current.Windows;
7.2.5 单实例应用程序
对于单实例应用程序,wpf目前未提供解决方案,目前都是使用变通的方式来进行单例运行
一:使用全局的mutex对象(由操作系统提供用于进程间通信的同步对象),简单有效,缺陷无法传递参数给已经运行的wpf实例。
Mutex mutex; protected override void OnStartup(StartupEventArgs e) { bool ret; mutex = new Mutex(true, "WpfChapter7", out ret); //参数为应用程序集名称 if(!ret) { MessageBox.Show("程序已运行,请不要重复运行"); App.Current.Shutdown(); } }
二:使用系统枚举进程名称判断程序是否运行
三: 通过引用Microsoft.VisualBasic.dll程序集,并继承Microsoft.VisualBasicApplicationServices.WindowsFormApplicationBase类来实现单例运行,此方式可以向已运行的程序传递参数,例如,双击word文档打开word程序
7.3 程序集资源
程序集资源也被称为二进制资源,因为他们作为不透明的的二进制数据嵌已编译的后的程序集中
7.3.1 添加资源
直接将资源文件(图片,视频等)拷贝至工程目录下,将其“Build Action” 属性设置为Resource 默认也是这个属性
使用资源 : xaml方式 < image source = "image/test.jpg" />
代码: Image.Source = new BitmapImage(new Uri("image/test.jpg",UriKind.Relative));
WPF中的URI语法
img.Source= new BitmapImage(new Uri("pack://application:,,,/image/test.jpg"));
使用绝对URI时,可以使用指向程序集资源的文件路径,网络共享的UNC路径、web站点UrL,当应用程序获取不到该资源时,将产生异常,如果URI使用