`
csstome
  • 浏览: 1558681 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

WPF系列之应用程序生命周期

 
阅读更多

摘要:

WPF是微软最新的图形用户界面技术,从2003年公之于众(当时开发代号Avalon),其革命性的创建软件的方式便引起了高度关注,特别是对于使用Windows Form和GDI开发的人员。时至今日使用WPF进行开发已经不是什么新鲜事,但我还是想写一点关于WPF的东西与不太了解WPF的朋友一起学习。OK,今天就从最基础的开始吧,我们一块看一下WPF应用程序的生命周期。

内容:

1.一个简单的WPF应用

2.WPF中的主窗体

3.Application的生命周期

4.单实例运行WPF应用

一、一个简单的WPF应用

WPF应用程序是一种包含Application对象的Windows进程,Application对象提供了生命周期服务,因此要了解WPF应用的生命周期我们就需要从Application开始。

首先我们建立一个WPF应用,在默认情况下我们运行这个应用程序。

MainWindow

我们使用默认WPF Application创建了一个WPF应用,默认情况下我们什么都不做,点击运行就会看到上面的窗口。那么这背后Visual Studio为我们做了什么呢?我们知道在Winform中有一个Program.cs,其中定义了Main函数,程序从Main开始执行,那么WPF有没有类似的函数呢?我们的MainWindow又是在何处指定运行的?

我们可以看到VS为我们自动生成了一个App.xaml及其对应的隐藏文件App.xaml.cs。在App.xaml.cs中我们可以看到它没有创建任何类,更没有启动MainWindow,那么打开App.xaml呢?打开App.xaml文件代码如下:

在这里我们看到x:Class="WPFLifeCycle.App",事实上这样的代码等同于创建了一个名为App的Application对象。而根节点Application的StartupUri属性指定了启动的窗口(StartupUri="MainWindow.xaml"),这就相当于创建了一个MainWindow类型的对象,然后调用其Show()方法。此时可能会有朋友问,按理说这个程序应该有个Main函数啊,为何在此看不到Main呢?程序如何创建Application?

其实,这一切都归功于App.xaml文件的一个属性BuildAction

BuildAction

BuildAction属性指定了程序生成的方式,默认为ApplicationDefinition。对于WPF程序来说,如果指定了BuildAction为ApplicationDefinition之后,WPF会自动创建 Main函数,并且自动检测Application定义文件,根据定义文件自动创建Application对象并启动它(当然它会根据StartupUri创建MainWindow并显示)。

既然如此我们将BuildAction设置为None试试,我们运行会发现抛出如下错误:

AppNoMainExceptio

很明显这时我们需要Main函数作为我们的程序入口,我们不妨手动创建试试,此时我们创建一个Program.cs类,代码如下:

运行之后我们看到的效果和之前完全一样。换句话说App.xaml文件和我们上面代码起到的效果是相同的,事实上上面的xaml代码在编译时编译器也会做出同样的解析,这也是WPF设计的一个优点--很多东西我们都可以在XAML中实现而不需要编写过多的代码。

备注: App.xaml帮我们做的工作具体如下:

a.创建Application对象,并且设置其静态属性Current为当前对象

b.根据StartupUri创建并显示UI

c.设置Application的MainWindow属性(主窗口)

d.调用Application对象的Run方法,并保持一直运行直到应用关闭

二、WPF中的主窗口

我们知道在Winform中我们有"主窗体"概念,在WPF中我们也同样有"主窗口"。"主窗口"是一个"顶级窗口",它不包含或者不从属于其他窗口。默认情况下,创建了Application对象之后会设置Application对象的MainWindow属性为第一个窗口对象来作为程序的"主窗口"。当然,如果你愿意这个属性在程序运行的任何时刻都是可以修改的。

在Winform中我们知道,主窗体关闭之后整个应用程序生命周期就会结束,这里我们不妨试试在WPF中是否如此。首先在应用程中添加另一个Window对象OtherWindow,然后在MainWindow中放一个按钮,点击按钮显示OtherWindow。运行效果如下:

TwoWindow

现在点击关闭MainWindow之后我们发现OtherWindow并未关闭,当然Application并未结束:

OtherWindow

这是不是说明Application关闭同Winform不同呢(当然我们调用Application.Current.Exit()是可以退出应用的)?在WPF中Application的关闭模式同Winform确实不同,WPF中应用程序的关闭模式有三种,它由Application对象的ShutdownMode属性来决定

ShutdownMode

它的枚举值如下:

枚举名称

枚举值

说明

OnLastWindowClose

0

当应用程序最后一个窗口关闭后则整个应用结束

OnMainWindowClose

1

当主窗口关闭后则应用程序结束

OnExplicitShutdown

2

只用通过调用Application.Current.Shutdown()才能结束应用程序

从上图我们也可以看到默认情况下ShutdownMode值是OnLastWindowClose,因此当MainWindow关闭后应用程序没有退出,如果要修改它可以将光标放到App.xaml中的XAML编辑窗口中,然后修改属性窗口中的ShutdownMode,也可以在XAML中或者程序中设置ShutdownMode属性。

三、Application的生命周期

下面我们看看Application的生命周期(引用网上一张图片)

WPFLifeCycle

上图片描述WPF应用的生命周期,其中值得一提的是Run方法后会调用应用程的Starup事件,而"已激活"、"已停用"分别对应Activated和Deactivate事件。DispatcherUnhandledException用来将事件路由到正确位置的对象,包括未处理的异常,可以用它来处理程序其他部分未处理的异常或者一些操作(例如保存当前文档)。当关闭、注销或者重新启动时则会触发SessionEnding事件,SessionEnding事件中的SessionEndingCancelEventArgs的ReasonSessionEnding属性可以指示你是执行了注销还是关闭(这是一个枚举属性)。

四、单实例运行WPF应用

虽然上面我们简单介绍了WPF应用的生命周期,但是默认情况下我们可以打开一个应用程序多个实例,例如你双击一个exe多次。当然有些时候这么做会带来很多好处,但是有时我们又不希望这么做,要避免这个问题其实很简单,同WinForm中单实例运行一个应用是一样的,我们只需要在应用程序启动时创建一个"排他锁",修改App.xaml.cs如下:

此时如果我们已经运行了WPFLifeCycle.exe,当再双击此应用则会给出提示:

SingletonRun

知识共享许可协议 作品采用知识共享署名 2.5 中国大陆许可协议进行许可,版权归CSDN博客园及作者本人共有。欢迎转载,演绎或用于商业目的。但转载请注明来自崔江涛(KenshinCui),并包含相关链接。
分享到:
评论

相关推荐

    WPF 应用程序开发.pdf

    - **Application 类**:是 WPF 应用程序的核心,它负责应用程序的生命周期管理,如启动、关闭等操作。 - **资源字典**:用于在应用程序范围内共享资源,提高资源的复用性。 - **异常处理**:WPF 提供了对未处理异常...

    wpf生命周期

    通过以上介绍,我们可以看到WPF应用程序的生命周期是由一系列事件组成的,每个事件都代表着应用程序的一个特定阶段。理解这些事件及其触发时机对于开发高质量的WPF应用程序至关重要。开发者可以根据这些事件来进行...

    WPF应用程序的入口

    #### App.xaml - 应用程序生命周期管理 在WPF应用程序中,`App.xaml` 是一个重要的组成部分,它主要负责管理整个应用程序的生命周期。具体来说,`App.xaml` 及其代码隐藏文件(通常为 `App.xaml.cs` 或 `App.xaml....

    WPF应用程序屏幕

    此外,可能还会有一个`App.xaml`文件,它是应用的全局资源字典和应用程序生命周期管理的入口点。 `packages`文件夹通常包含NuGet包的依赖,NuGet是一个.NET的包管理器,用于简化第三方库的引用和更新。在开发WPF...

    WPF中嵌入其它应用程序窗口

    本文将深入探讨如何在WPF应用中嵌入其他应用程序的窗口,并通过提供的源码进行详细讲解。 **一、基本原理** WPF中实现嵌入其他应用程序窗口主要依赖于Windows API,特别是`CreateProcess`和`SetParent`这两个API...

    使用WPF构建复合应用程序

    **WPF(Windows Presentation Foundation)** 是微软开发的一种用于构建Windows客户端应用程序的技术,它集成了UI设计、数据绑定、媒体处理、3D图形和资源管理等多个功能。WPF提供了丰富的控件集、强大的样式和模板...

    WPF经典教程之WPF应用程序管理

    WPF应用程序的生命周期是由`System.Windows.Application`类管理的。这个类负责处理应用程序的启动、运行、资源管理和关闭等关键任务。`Application`类提供了许多属性和方法,帮助开发者控制应用程序的行为。 二、...

    使用WPF创建Windows应用和Web应用

    **WPF(Windows Presentation Foundation)** 是微软.NET Framework框架下的一个关键组件,专门用于构建具有丰富用户界面的桌面应用程序。WPF提供了强大的图形渲染能力,包括2D和3D图形、音频、视频以及文本处理,...

    WPF中的窗口的生命周期

    在Windows Presentation Foundation (WPF) 中,窗口的生命周期是一系列事件和状态的组合,这些事件和状态定义了窗口从创建到关闭的整个过程...总之,熟悉WPF窗口的生命周期对于开发高效且用户友好的应用程序至关重要。

    WPF 基础视频教程(共50集)-3.只使用代码创建WPF应用程序

    应用程序生命周期 在WPF中,`Application`类负责管理应用程序的生命周期。虽然我们没有XAML的`App.xaml.cs`文件,但仍需实现启动逻辑。在`Program.cs`中,你可以调用`Application.Run`方法来启动窗口: ```csharp...

    WPF应用程序管理详细解析

    在WPF应用程序管理中,核心组件是`System.Windows.Application`类,它负责管理应用程序的生命周期、资源和窗口。下面将详细解析WPF应用程序的创建、启动、关闭策略以及其他关键特性。 ### 一、WPF应用程序的创建与...

    WPF入门教程系列一基础

    WPF应用程序的生命周期由Application对象管理,每个应用程序域中只有一个Application实例存在。通过App.xaml和App.xaml.cs文件组合来定义Application对象的行为,这一点与*** Web Forms有相似之处,将界面定义和行为...

    WPF学习笔记 ——主流桌面应用开发技术

    #### 六、WPF的应用程序生命周期 WPF应用程序通常包含一个主窗口(MainWindow),该窗口在应用程序启动时自动打开。此外,WPF还提供了两种用于导航的控件:`Frame` 和 `NavigationWindow`。前者用于在一个窗口或...

    WPF开发指南实用.pdf

    WPF开发指南涵盖了WPF开发的各个方面,包括声明性编程、高性能应用程序、简易的部署、分离设计人员与开发人员、向量图形、图形和文本服务、文档生命周期、2D图形、开发设计环境、安装软件、Microsoft Expression、佈...

    如何在WPF应用程序中通过HttpClient调用Web API

    2. **创建HttpClient实例**:在你的代码中,创建一个HttpClient实例,这通常是放在类的构造函数中,以便在整个类的生命周期中复用。 ```csharp private readonly HttpClient _httpClient = new HttpClient(); ``` ...

    WPF全局异常捕获Demo,防止程序运行过程中出现异常崩溃

    首先,我们要理解WPF应用程序的生命周期,以及在何处设置全局异常处理。WPF应用程序通常从`App.xaml.cs`文件中的`Startup`事件开始,因此这是一个理想的起点来注册全局异常处理器。 1. **启动事件处理**:在`App....

    wpf经典教程.pdf

    应用程序关闭则是指在应用程序生命周期结束时进行的清理和资源释放过程。 WPF应用程序的窗体管理涉及到窗体的生存周期。在WPF中,窗体的生命周期从显示窗体开始,直到窗体关闭。显示窗体指的是窗体被加载到屏幕上并...

    WPFSamples WPF 实例

    这包括使用`AppDomain`和`Windows Workflow Foundation (WF)`来演示跨进程通信和应用程序生命周期管理。 3. **Controls(控件)** 这部分包含了各种WPF内置控件的示例,如按钮、文本框、列表视图等。这些示例详细...

    WPF自定义exe进程嵌入控件

    - 使用Visual Studio创建一个新的WPF应用程序项目。 - 在XAML文件中设计用户界面,预留一个区域来承载外部exe进程。 2. **托管exe进程** - 在C#代码中,使用`System.Diagnostics.Process`类来启动和管理外部exe...

    WPF实例源码(WPF初学者的好东西)

    **压缩包子文件的文件名称:“ApplicationLifecycle”** 这个文件名可能代表了一个关于WPF应用程序生命周期的示例。在WPF中,一个应用程序从启动到关闭会经历一系列的生命周期阶段,包括初始化、加载、显示、运行、...

Global site tag (gtag.js) - Google Analytics