Application类

 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使用

 

posted @ 2018-10-31 17:55  迷~途  阅读(1072)  评论(0编辑  收藏  举报