接上文WPF入门教程系列二——Application介绍,我们继续来学习Application

三、WPF应用程序的关闭

WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序才停止运行。 ShutDown 是隐式或显式发生,可以通过指定 ShutdownMode 的属性值来进行设置。

ShutdownMode选项

OnLastWindowClose(默认值):

应用程序关闭时,或最后一个窗口关闭时关闭,或调用Application对象的Shutdown() 方法时,应用程序关闭。

OnMainWindowClose

启动窗体关闭或调用Application对象的Shutdown()方法时,应用程序关闭。(和C#的Windows应用程序的关闭模式比较类似)

OnExplicitShutdown

只有在调用Application对象的Shutdown()方法时,应用程序才会关闭。

  1. 对ShutdownMode选项的更改,可以直接在App.xaml中更改,如下代码。
  1. <Application x:Class="WpfApp1.App"
  2.  
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4.  
  5. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  6.  
  7. StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown" >
  8.  
  9. <Application.Resources>
  10.  
  11. </Application.Resources>
  12.  
  13. </Application>

2.  在代码文件(App.xaml.cs)中修改ShutdownMode选项,但必须注意这个设置要写在app.Run()方法之前 ,如下代码。

  1. app.ShutdownMode = ShutdownMode.OnExplicitShutdown;
  2. app.Run(win);

Application对象的其他属性:

名称

说明

Current

获取当前 AppDomain的 Application 对象。

Dispatcher

获取与此 DispatcherObject 关联的 Dispatcher。
(继承自 DispatcherObject。)

MainWindow

获取或设置应用程序的主窗口。

Properties

获取应用程序范围的属性集合。

ResourceAssembly

获取或设置对于 WPF 应用程序的资源提供已装箱统一资源标识符
(URI) 的 Assembly 。

Resources

获取或设置应用程序范围资源的集合,例如样式和画笔。

ShutdownMode

获取或设置会导致 Shutdown 方法调用的情况。

StartupUri

获取或设置自动显示的 UI ,当应用程序启动时。

Windows

获取在应用程序中实例化窗口。

四、添加Application对象事件

名称

说明

Activated

当应用程序成为前台应用程序时触发。

Deactivated

当应用程序不再是前台应用程序时触发。

DispatcherUnhandledException

如果异常是由应用程序引发,但未处理,触发。

Exit

在应用程序关闭之前,触发,而且不能撤消。

FragmentNavigation

发生在应用程序的一个浏览器启动导航到内容片段导航时,会立即发生,如果所需片段在当前目录,或者,在源 XAML 目录加载后,如果所需片段在其他内容。

LoadCompleted

在导航到在应用程序中的一个浏览器的目录加载的分析完成并已呈现时触发。

Navigated

当导航到在应用程序中使用的浏览器已找到的内容时触发,这时它可能还没有完成加载。

Navigating

在一个新的导航由应用程序,一个浏览器请求发生。

NavigationFailed

出现问题,则错误,当应用程序的一个浏览器导航到所请求的内容时。

NavigationProgress

定期发生在应用程序中使用浏览器管理提供导航进度信息的下载过程。

NavigationStopped

发生在一个浏览器的 StopLoading 方法在应用程序的调用,或者,如果新的导航由浏览器请求,在当前导航正在进行的。

SessionEnding

当用户在注销或关闭操作系统关闭
Windows 会话时发生。

Startup

当 Application 对象的
Run 方法调用,发生。

在应用程序中添加事件的方式有如下三种。

第一种方式:

1、在App.xaml中做事件的绑定,在App.xaml.cs文件中添加事件的处理方法

在App.xaml文件中,具体添加方法见下图。

2、添加完事件之后的app.xml文件代码如下

  1. <Application x:Class="WpfApp1.App"
  2.  
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4.  
  5. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  6.  
  7. StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown" Activated="Application_Activated" Exit="Application_Exit">
  8.  
  9. <Application.Resources>
  10.  
  11. </Application.Resources>
  12.  
  13. </Application>

3、在App.xaml.cs文件的代码如下:

  1. using System;
  2.  
  3. using System.Collections.Generic;
  4.  
  5. using System.Configuration;
  6.  
  7. using System.Data;
  8.  
  9. using System.Linq;
  10.  
  11. using System.Threading.Tasks;
  12.  
  13. using System.Windows;
  14.  
  15. namespace WpfApp1
  16.  
  17. {
  18.  
  19. /// <summary>
  20.  
  21. /// App.xaml 的交互逻辑
  22.  
  23. /// </summary>
  24.  
  25. public partial class App : Application
  26.  
  27. {
  28.  
  29. private void Application_Activated(object sender, EventArgs e)
  30.  
  31. {
  32.  
  33. }
  34.  
  35. private void Application_Exit(object sender, ExitEventArgs e)
  36.  
  37. {
  38.  
  39. }
  40.  
  41. }
  42.  
  43. }

4.在使用以上方式添加事件之后,如果在Visual Studio中按F5 执行应用程序时,报以下错误“不包含适合于入口点的静态‘Main’方法”。这个错误是由于Visual Studio把项目文件(*.csproj)中原来自动生成的app.xaml相关的定义进行了修改。具体区别如下:

 1)
直接新建的WPF项目中的有关App.xaml的定义如下:

  1. <ApplicationDefinition Include="App.xaml">
  2.  
  3. <Generator>MSBuild:Compile</Generator>
  4.  
  5. <SubType>Designer</SubType>
  6.  
  7. </ApplicationDefinition>

2) Visual Studio把修改后的App.xaml的配置代码如下:

  1. <Page Include="App.xaml">
  2.  
  3. <SubType>Designer</SubType>
  4.  
  5. <Generator>MSBuild:Compile</Generator>
  6.  
  7. </Page>

  第一段代码中App.xaml在项目文件里面用ApplicationDefinition标签定义。第二段代码中App.xaml在项目文件里面用Page标签定义,这种定义是指App.xaml只是一个页面而已。

  因此,只需要把项目文件中将App.xaml的配置由Page修改成ApplicationDefinition即可。

第二种方式

1、可以像是在WinForm中的Program类中写Main方法一样,在WPF中一样可以自定义一个app类中写main及其他相关事件。

  1. using System;
  2.  
  3. using System.Collections.Generic;
  4.  
  5. using System.Linq;
  6.  
  7. using System.Text;
  8.  
  9. using System.Threading.Tasks;
  10.  
  11. using System.Windows;
  12.  
  13. namespace WpfApp1
  14.  
  15. {
  16.  
  17. class App
  18.  
  19. {
  20.  
  21. [STAThread]
  22.  
  23. static void Main()
  24.  
  25. {
  26.  
  27. // 定义Application对象作为整个应用程序入口
  28.  
  29. Application app = new Application();
  30.  
  31. MainWindow win = new MainWindow();
  32.  
  33. app.ShutdownMode = ShutdownMode.OnMainWindowClose;
  34.  
  35. app.MainWindow = win;
  36.  
  37. //是必须的,否则无法显示窗体
  38.  
  39. win.Show();
  40.  
  41. app.Run();
  42.  
  43. app.Activated += app_Activated;
  44.  
  45. app.Exit += app_Exit;
  46.  
  47. }
  48.  
  49. static void app_Activated(object sender, EventArgs e)
  50.  
  51. {
  52.  
  53. throw new NotImplementedException();
  54.  
  55. }
  56.  
  57. static void app_Exit(object sender, ExitEventArgs e)
  58.  
  59. {
  60.  
  61. throw new NotImplementedException();
  62.  
  63. }
  64.  
  65. }
  66.  
  67. }

第三种方式

  1. 在App.xaml界面中,如下图位置1处,输入Exit事件名称,Visual Studio 2013会弹出一个菜单“新建事件处理程序”,双击这个菜单,Visual Studio 2013就会自动创建一个“Application_Exit”事件,如下图位置2处。

五、WPF应用程序生存周期

WPF应用程序的生命周期与执行顺序,用MSDN上的一张图片进行说明。下图显示了窗口的生存期中的主体事件的顺序。

WPF入门教程系列三——Application介绍(续)的更多相关文章

  1. WPF入门教程系列二——Application介绍

    一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只 ...

  2. WPF入门教程系列四——Dispatcher介绍

    一.Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以 ...

  3. WPF入门教程系列六——布局介绍与Canvas(一)

    从这篇文章开始是对WPF中的界面如何布局做一个较简单的介绍,大家都知道:UI是做好一个软件很重要的因素,如果没有一个漂亮的UI,功能做的再好也无法吸引很多用户使用,而且没有漂亮的界面,那么普通用户会感 ...

  4. WPF入门教程系列五——Window 介绍

    一.窗体类基本概念 对于WPF应用程序,在Visual Studio和Expression Blend中,自定义的窗体均继承System.Windows.Window类.用户通过窗口与 Windows ...

  5. WPF入门教程系列三

    WPF之Binding的使用(一) 一.  前言 初学WPF经常被Binding搞得苦不堪言,Binding的重用性就不做介绍了,在WPF应用程序开发中Binding是一个非常重要的部分.WPF也是近 ...

  6. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  7. WPF入门教程系列(一) 创建你的第一个WPF项目

    WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...

  8. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  9. WPF入门教程系列一

    WPF入门教程 一.  前言  公司项目基于WPF开发,最近项目上线有点空闲时间写一篇基于wpf的基础教材,WPF也是近期才接触,学习WPF也是在网上查资料与微软的MSDN进行学习,写本博客的目为了温 ...

随机推荐

  1. 成都印迹婚纱摄影 | yinjilove.com

    成都印迹婚纱摄影工作室 官方网站:http://yinjilove.com/ 联系方式:028-84278563 手机及微信号:18180642817 微信公众号:印迹摄影 地址:成都市锦江区牛王庙东 ...

  2. 『TCP/IP详解——卷一:协议』读书笔记——18

    2013-08-27 15:44:52 第7章 Ping程序 7.1 引言 “ping”这个名字来源于声纳定为操作.Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达.该程序发送 ...

  3. JS中可拖拽的甘特图和流程图

    甘特图: https://www.douban.com/note/441706674/ https://www.uedsc.com/jquery-ganttview.html https://gith ...

  4. JAVA单例的三种实现方式

    1. public class MySingleton { private MySingleton() {} private MySingleton instance = new MySingleto ...

  5. Web Workers

    在 Web Workers 中使用 postMessage 和 onmessage 首先,需要在客户端页面的 JavaScript 代码中 new 一个 Worker 实例出来,参数是需要在另一个线程 ...

  6. AndroidManifest.xml中<activity></activity>相关属性说明

    虽说,从事android开发有一定时间了,对于Activity大家也都不陌生,但是具体的对于Activity中相关属性的含义有必要做一个系统的总结: intent-filteraction: 来指定响 ...

  7. C++多态(二)——函数重载(overloading)和操作符重载

       任何函数都能重载. 一.普通函数的重载 C语言中一个函数只能处理一个类型的数据,不可能兼顾两种或多种数据类型:C++使用使用同一名称的函数来处理多个类型的数据. #include <ios ...

  8. 备库Seconds_Behind_Master的计算

    背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库 ...

  9. 蛙蛙推荐:快速自定义Boostrap样式

    现在越来越多的网站使用Bootstrap,相信大家也审美疲劳了,所以我们要用Bootstrap的第一步就是先把顶部的导航栏来自定义一下. 我现在使用的是bootstrap3.0,顶部导航定义如下 &l ...

  10. 微信网页开发之创建Controller(三)

    首先,我们需要在App区域下添加一个控制器,这里我们就以AppDemoController为例.如下图所示: 注意:你也可以自己创建其他区域,只是这里推荐使用App区域. 创建好之后,请添加自己的Ac ...