归档/2025.01.12·WPF

WPF中的Application类

写 WPF 肯定绕不开 Application 类。这篇文章盘点了它的几个核心属性和控制程序生命周期的关键方法,理清这些,对 WPF 程序的启动和退出流程会有更清晰的认知。

定义

Application类在WPF中程序中代表了当前的应用程序对象,等应用程序对象创建出来以后,可以在程序的任何位置用Application.Current的方式获取该对象。下面先来罗列一下Application提供的属性、方法和事件。

主要属性

Current

类型:System.Windows.Application 在当前的应用域(AppDomain唯一的应用对象),从触发OnStartup事件之后程序的全局位置都可以获取。

MainWindow

类型:System.Windows.Window 一个窗口对象,代表着应用程序的主窗口,没有显式设置的情况,MainWindow属性等于第一个弹出来的窗口对象,后续可以按需设置其他的窗口。

Properties

类型:IDictionary 应用程序的属性集合。可以存储一些全局的<k,v>属性信息

//类似于这种全局的信息
Application.Current.Properties.Add("lang", "en-US");
Application.Current.Properties.Add("version", "1.0.0");

Resources

类型:ResourceDictionary 可以获取或设置应用程序的资源字典。

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml">
  <Application.Resources>
    <SolidColorBrush x:Key="BackgroundColor" Color="Yellow"></SolidColorBrush>
  </Application.Resources>
</Application>

ShutdownMode

类型:是枚举类型(默认值是0,即OnLastWindowClose——)

  • OnLastWindowClose——最后一个窗口对象关闭时,退出程序
  • OnMainWindowClose——主窗口关闭时,退出程序
  • OnExplicitShutdown——只有显式的关闭时,才退出程序

获取或设置应用程序的关闭模式。

Windows

类型:WindowCollection 获取应用程序的窗口集合。当一个window对象在UI线程上初始化之后会添加到这个集合中,在处理完Closing事件之后会移除。

主要方法

OnActivated

  • 应用程序启动的时
  • 从最小化回来的时候也会被调用

OnDeactivated

  • 关闭程序的时
  • 程序最小化

OnExit

最后程序退出之前调用,可以做一些资源回收的事情。类似于python中的atexit模块

Shutdown

显式的关闭当前进程

WPF程序的生命周期

%%{init: {"flowchart": {"nodeSpacing": 18, "rankSpacing": 24, "diagramPadding": 6}, "themeVariables": {"fontSize": "14px"}}}%%
flowchart TB
  subgraph Start["启动"]
    direction TB
    S1["StartUp:Application"] --> S2["Initialized:Window"] --> S3["SourceInitialized:Window"] --> S4["Activated:Application"] --> S5["Activated:Window"]
  end
 
  classDef stage fill:#f7f3ff,stroke:#b8ade8,stroke-width:1.5px,color:#3b3553;
  class S1,S2,S3,S4,S5 stage;
Rendering diagram…
%%{init: {"flowchart": {"nodeSpacing": 18, "rankSpacing": 24, "diagramPadding": 6}, "themeVariables": {"fontSize": "14px"}}}%%
flowchart TB
  subgraph Finish["结束"]
    direction TB
    E1["Closing:Window"] --> E2["Deactivated:Window"] --> E3["Deactivated:Application"] --> E4["Closed:Window"] --> E5["Exit:Application"]
  end
 
  classDef stage fill:#f7f3ff,stroke:#b8ade8,stroke-width:1.5px,color:#3b3553;
  class E1,E2,E3,E4,E5 stage;
Rendering diagram…