【WPF学习】第二十六章 Application类——应用程序的生命周期

本文主要是介绍【WPF学习】第二十六章 Application类——应用程序的生命周期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  在WPF中,应用程序会经历简单的生命周期。在应用程序启动后,将立即创建应用程序对象,在应用程序运行时触发各种应用程序事件,你可以选择监视其中的某些事件。最后,当释放应用程序对象时,应用程序将结束。

一、创建Application对象

  使用Application类的最简单方式是手动创建它。下面的示例演示了最小的程序:在应用程序入口(Main()方法)处创建名为MainWindow的窗口,并启动一个新的应用程序:

  在本质上,Visual Studio为Application类使用的模型与用于窗口的模型相同。起点是XAML模板,默认情况下该模板被命名为App.xaml,它看起来如下所示:

<Application x:Class="TestApplication.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"StartupUri="MainWindow.xaml">
</Application>

  在“【WPF学习】第四章 加载和编译XAML”介绍过,在XAML中使用Class特性创建派生自元素的类。因此,该类创建派生自Application的类,类名为TestApplication.App(TestApplication是项目名称,也是在其中定义类的名称空间,App是Visual Studio为派生自Application的自定义类使用的名称。如果愿意,可将类名该为任何更有趣的内容)。

  Application标签不仅创建自定义的应用程序类,还设置StartupUri属性来确定代表主窗口的XAML文档。因此,不需要时候用代码显示地实例化这个窗口——XAML解析器将自动完成这项工作。

  与窗口一样,应用程序类也在两个独立部分中进行定义,在编译时融合到一起。自动生成的部分在项目中是不可见的,但该部分包含Main()入口出以启动应用程序的代码。该部分看起来如下所示:

public class App:Application{[STAThread]public static void Main(){Program app = new Program();app.MainWindow = new MainWindow("MainWindow.xaml");app.MainWindow.ShowDialog();}}

  如果确实对查看XAMl模板创建的自定义应用程序类感兴趣,可查找位于项目目录中的obj\Debug文件夹中的App.g.cs文件。

  这里给出的自动生成的代码和手工编写的自定义应用程序类代码之间唯一的区别是,自动生成的类使用StartupUri属性,而不是设置MainWindow属性或把住窗体作为参数传递给Run()方法。只要使用相同的URI格式,就可以自由地使用这种方法创建自定义应用程序类。需要创建相对Uri对象,用于命名项目中的XAML文档(该XAML文档是编译过的,并作为BAML资源被嵌入到应用程序的程序集中。该资源的名称就是原来XAML文件的名称。在上面的示例中,应用程序包含名为MainWindow.xaml的资源,该资源包含以编译过的XAML文档)。

  自定义应用程序类的第二部分存储在项目中诸如App.xaml.cs的文件中。该部分包含开发人员添加的处理事件的代码,最初是空的:

public partial class App : Application{}

  这个文件通过部分类技术和自动生成的应用程序代码融合到一起。

三、应用程序的关闭方式

  通常,只要还有窗口尚未关闭,Application类就保持应用程序处于有效状态。如果这不是期望的行为,可调整Application.ShutdownMode属性。如果手动实例化Application对象,就需要在调用Run()方法之前设置ShutdownMode属性。如果使用App.xaml文件,那么可在XAML文件中简单设置ShutdownMode属性。

  对于关闭模式有三种选择,如下表所示:

表 ShutdownMode枚举值

   例如,如果希望使用OnMainWindowClose方式,并且正在使用App.xaml文件,那么需要添加如下内容:

<Application x:Class="TestApplication.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"StartupUri="MainWindow.xaml" ShutdownMode="OnMainWindowClose">
</Application>

  不管选择哪种关闭方法,总是可以使用Application.Shutdown()方法立即终止应用程序(当然,当调用Shutdown()方法时,应用程序未必立刻停止运行。调用Application.Shutdown()方法会导致Application.Run()方法立即返回,但仍可继续运行Main()方法中的其他带代码或者响应Application.Exit事件)。

四、应用程序事件

  最初,App.xaml.cs文件不包含任何代码。尽管不需要代码,但可添加代码来处理应用程序事件。Application类提供了为数不多的非常有用的事件。下表给出了其中重要的几个。

表 应用程序事件

    处理事件时有两种选择:关联事件处理程序或重写相应的受保护方法。如果选择处理应用程序事件,不需要使用委托代码来关联事件处理程序,而是可以使用App.xaml文件中的某个特性来关联事件处理程序。例如,如果有如下事件处理程序:

private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e){MessageBox.Show("An unhandled " + e.Exception.GetType().ToString() +" exception was caught and ignored.");e.Handled = true;}

  可使用下面的XAML来连接上面的事件处理程序:

<Application x:Class="TestApplication.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"StartupUri="MainWindow.xaml" ShutdownMode="OnMainWindowClose" DispatcherUnhandledException="Application_DispatcherUnhandledException"><Application.Resources></Application.Resources>
</Application>

  对于每个应用程序事件,可调用相应的方法来引发该事件。这个方法的名称就是事件的名称,只要在前面加上前缀On,因此Startup变成了OnStartup(),Exit变成OnExit(),等等。这种方式在.NET中是十分常见的。唯一的例外是DispatcherExceptionUnhandled事件——该事件没有相应的OnDispatcherExceptionUnhandled()方法,所以始终需要使用事件处理程序。

  下面是一个自定义的应用程序类,它重写了OnSessionEnding()方法, 并且如未设置了相应的标志,该方法会阻止关闭系统和应用程序自身:

public partial class App : Application{private bool unsavedData = false;public bool UnSavedData{get { return unsavedData; }set { unsavedData = value; }}protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);unsavedData = true;}protected override void OnSessionEnding(SessionEndingCancelEventArgs e){base.OnSessionEnding(e);if (unsavedData){e.Cancel = true;MessageBox.Show("The application attempted to be closed as a result of " +e.ReasonSessionEnding.ToString() +".This is not allowed,as you have unsaved data.");}}
}

  当重写应用程序方法时,最好首先调用基类的实现。通常,基类的实现知识引发相应的应用程序事件。

  显然,实现这一技术的更精妙的方法是,不使用消息框,而应显示几个确认对话框,让用户选择是继续(退出应用程序和Window系统)还是取消关闭。

这篇关于【WPF学习】第二十六章 Application类——应用程序的生命周期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536263

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个