WPF/C#:程序关闭的三种模式
ShutdownMode枚举类型介绍
ShutdownMode是一个枚举类型,它定义了WPF应用程序的关闭方式。这个枚举类型有三个成员:
- OnLastWindowClose:当最后一个窗口关闭或者调用System.Windows.Application.Shutdown方法时,应用程序会关闭。
- OnMainWindowClose:当主窗口关闭或者调用System.Windows.Application.Shutdown方法时,应用程序会关闭。
- OnExplicitShutdown:只有当调用System.Windows.Application.Shutdown方法时,应用程序才会关闭。
整理成表格如下所示:
| 枚举成员 | 含义 |
|---|---|
| OnLastWindowClose | 当最后一个窗口关闭或者调用System.Windows.Application.Shutdown方法时,应用程序会关闭。 |
| OnMainWindowClose | 当主窗口关闭或者调用System.Windows.Application.Shutdown方法时,应用程序会关闭。 |
| OnExplicitShutdown | 只有当调用System.Windows.Application.Shutdown方法时,应用程序才会关闭。 |
实践
MainWindow的xaml如下:
<Window x:Class="ApplicationShutdown.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:ApplicationShutdown"mc:Ignorable="d"Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_Loaded"><DockPanel><StackPanel DockPanel.Dock="Top" Orientation="Horizontal"><Label HorizontalAlignment="Left">Shutdown Mode:</Label><ComboBox HorizontalAlignment="Left" Name="shutdownModeListBox" /></StackPanel><StackPanel DockPanel.Dock="Top" Orientation="Horizontal"><Label HorizontalAlignment="Left">Application Exit Code (for explicit shutdown):</Label><TextBox HorizontalAlignment="Left" Name="appExitCodeTextBox">0</TextBox></StackPanel><Button DockPanel.Dock="Top" Click="newWindowButton_Click">New Window</Button><Button DockPanel.Dock="Top" Click="explicitShutdownButton_Click">Shutdown Explicitly (Passing Exit Code)</Button><Canvas /></DockPanel>
</Window>
MainWindow的cs如下:
using System;
using System.Windows;
using System.Windows.Controls;namespace ApplicationShutdown
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void MainWindow_Loaded(object sender, RoutedEventArgs e){shutdownModeListBox.Items.Add("OnLastWindowClose");shutdownModeListBox.Items.Add("OnExplicitShutdown");shutdownModeListBox.Items.Add("OnMainWindowClose");shutdownModeListBox.SelectedValue = "OnLastWindowClose";shutdownModeListBox.SelectionChanged +=shutdownModeListBox_SelectionChanged;Application.Current.ShutdownMode = ShutdownMode.OnLastWindowClose;}private void shutdownModeListBox_SelectionChanged(object sender, SelectionChangedEventArgs e){Application.Current.ShutdownMode =(ShutdownMode) Enum.Parse(typeof (ShutdownMode), shutdownModeListBox.SelectedValue.ToString());}private void newWindowButton_Click(object sender, RoutedEventArgs e){(new ChildWindow()).Show();}private void explicitShutdownButton_Click(object sender, RoutedEventArgs e){var exitCode = 0;int.TryParse(appExitCodeTextBox.Text, out exitCode);Application.Current.Shutdown(exitCode);}}
}
ChildWindow的xaml如下:
<Window x:Class="ApplicationShutdown.ChildWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:ApplicationShutdown"mc:Ignorable="d"Title="ChildWindow" Height="300" Width="300" Closing="ChildWindow_Closing" Closed="ChildWindow_Closed"><Grid/>
</Window>
ChildWindow的cs如下:
using System;
using System.ComponentModel;
using System.Windows;namespace ApplicationShutdown
{/// <summary>/// Interaction logic for ChildWindow.xaml/// </summary>public partial class ChildWindow : Window{public ChildWindow(){InitializeComponent();}private void ChildWindow_Closing(object sender, CancelEventArgs e){Console.WriteLine(@"Closing");var result = MessageBox.Show("Allow Shutdown?", "Application Shutdown Sample",MessageBoxButton.YesNo,MessageBoxImage.Question);e.Cancel = (result == MessageBoxResult.No);}private void ChildWindow_Closed(object sender, EventArgs e){Console.WriteLine(@"Closed");}}
}
OnLastWindowClose
当最后一个窗口关闭或者调用System.Windows.Application.Shutdown方法时,应用程序会关闭。
最后一个窗口关闭:

调用System.Windows.Application.Shutdown方法:

OnMainWindowClose
当主窗口关闭或者调用System.Windows.Application.Shutdown方法时,应用程序会关闭。
主窗口关闭:

或者调用System.Windows.Application.Shutdown方法关闭,与上面效果相同,这里就不重复了。
OnExplicitShutdown
只有当调用System.Windows.Application.Shutdown方法时,应用程序才会关闭。
普通关闭:

关闭所有窗口之后,程序并不会停止。
调用System.Windows.Application.Shutdown方法:

总结
本文介绍了WPF程序的三种不同的关闭模式,分别是OnLastWindowClose、OnMainWindowClose与OnExplicitShutdown。
• OnLastWindowClose:当最后一个窗口关闭或者调用System.Windows.Application.Shutdown方法时,应用程序会关闭。
• OnMainWindowClose:当主窗口关闭或者调用System.Windows.Application.Shutdown方法时,应用程序会关闭。
• OnExplicitShutdown:只有当调用System.Windows.Application.Shutdown方法时,应用程序才会关闭。
借助图解更好理解:

代码来源
[WPF-Samples/Application Management/ApplicationShutdown at main · microsoft/WPF-Samples (github.com)](https://github.com/microsoft/WPF-Samples/tree/main/Application Management/ApplicationShutdown)
相关文章:
WPF/C#:程序关闭的三种模式
ShutdownMode枚举类型介绍 ShutdownMode是一个枚举类型,它定义了WPF应用程序的关闭方式。这个枚举类型有三个成员: OnLastWindowClose:当最后一个窗口关闭或者调用System.Windows.Application.Shutdown方法时,应用程序会关闭。O…...
登录/注册- 滑动拼图验证码(IOS/Swift)
本章介绍如何使用ios开发出滑动拼图验证码,分别OC代码和swift代码调用 1.导入项目model文件OC代码(下载完整Demo) 2.放入你需要显示的图片 一:OC调用 #import "ViewController.h" #import "CodeView.h"…...
MyBatis进行模糊查询时SQL语句拼接引起的异常问题
项目场景: CRM项目,本文遇到的问题是在实现根据页面表单中输入条件,在数据库中分页模糊查询数据,并在页面分页显示的功能时,出现的“诡异”bug。 开发环境如下: 操作系统:Windows11 Java&#…...
网站调用Edge浏览器API:https://api-edge.cognitive.microsofttranslator.com/translate
Edge浏览器有自带的翻译功能,在运行pc项目可能会遇到疯狂调用Edge的API https://api-edge.cognitive.microsofttranslator.com/translate 这个URL(https://api-edge.cognitive.microsofttranslator.com/translate)指向的是微软服务中的API接…...
css实现优惠券样式
实现优惠券效果: 实现思路: 需要三个盒子元素,使用 css 剪裁,利用 ellipse 属性,将两个盒子分别裁剪成两个半圆,位置固定在另一个盒子元素左右两边适当位置上。为另一个盒子设置想要的样式,圆角…...
函数递归(C语言)(详细过程!)
函数递归 一. 递归是什么1.1 递归的思想1.2 递归的限制条件 二. 递归举例2.1 求n的阶乘2.2 按顺序打印一个整数的每一位 三. 递归与迭代3.1 求第n个斐波那契数 一. 递归是什么 递归是学习C语言很重要的一个知识,递归就是函数自己调用自己,是一种解决问题…...
uniapp 接口请求封装
根目录下创建 config目录 api.js request.js // request.js // 封装一个通用的网络请求函数 适当调整 function httpRequest(options) {const userToken uni.getStorageSync(access_token).token;return new Promise((resolve, reject) > {uni.request({url: ${options.ur…...
C++中的观察者模式
目录 观察者模式(Observer Pattern) 实际应用 股票价格监控系统 发布-订阅系统 总结 观察者模式(Observer Pattern) 观察者模式是一种行为型设计模式,它定义了对象间的一对多依赖关系。当一个对象的状态发生改变…...
conda虚拟环境,安装pytorch cuda cudnn版本一致,最简单方式
1、pytorch版本安装(卸载也会有问题) (1)版本如何选择参考和卸载 https://zhuanlan.zhihu.com/p/401931724 (2)对应版本如何安装命令 https://pytorch.org/get-started/previous-versions/ 最简答安装参考…...
第 5 章:面向生产的 Spring Boot
在 4.1.2 节中,我们介绍了 Spring Boot 的四大核心组成部分,第 4 章主要介绍了其中的起步依赖与自动配置,本章将重点介绍 Spring Boot Actuator,包括如何通过 Actuator 提供的各种端点(endpoint)了解系统的…...
在 Windows 操作系统中,可以通过命令行工具来杀死进程
1. 使用 taskkill 命令 taskkill 命令是一个用于终止进程的命令行工具,可以通过进程名称或进程 ID (PID) 来杀死进程。 按进程名称杀死进程 taskkill /IM processname.exe /Fprocessname.exe 是进程的名称。/F 参数表示强制终止进程。 例如,终止名为…...
uni-app文件下载 h5 xls 乱码 锟斤拷 Blob pdf打不开
原先下载方式,PC管理端和浏览器打开文件能下载,xls没出现乱码,pdf能正常显示,H5下载xls乱码锟斤拷,PDF显示空白内容 怀疑是前端问题,也尝试过修改后端代码 后端设置编码格式 response.setCharacterEncoding(characte…...
Vue25-内置指令02:v-text指令
一、v-html对比v-text v-html支持结构的解析,v-text不支持结构的解析。 二、v-html的安全性问题 2-1、cookie的原理(node.js) 7天免登录,cookie实现。 cookie的本质就是类似于json的字符串,格式是:key-va…...
stable diffusion中的negative prompt是如何工作的
https://stable-diffusion-art.com/how-negative-prompt-work/https://stable-diffusion-art.com/how-negative-prompt-work/https://zhuanlan.zhihu.com/p/644879268...
STM32项目分享:智能小区充电桩系统
目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…...
PDU模块中浪涌保护模块与空开模块的应用
由于PDU具体应用的特殊性,其在规划设计时具有应用场景的针对性,同时PDU的高度定制化的特点,是其他电气联接与保护产品所不具备的。 PDU基础的输出输入功能外,其电路的控制与电压保护器同时也极为重要。空气开关和浪涌保护器相关功…...
19、Go Gin框架集成Swagger
介绍: Swagger 支持在 Gin 路由中使用一系列注释来描述 API 的各个方面。以下是一些常用的 Swagger 注释属性,这些属性可以在 Gin 路由的注释中使用: Summary: 路由的简短摘要。Description: 路由的详细描述。Tags: 用于对路由进行分类的标…...
自动同步库数据——kettle开发36
kettle中的那些人工智能。 一、kettle的AI能力目录 跨库同步 2.自动开发 3.自动优化 二、AI实例 1、跨库同步 sqlsever表同步至oracle数据库 1.1源库sqlserver 1.2目标库oracle 1.3可视化跨库同步 使用多表复制向导 选择跨库的表,下一步下一步,即可…...
MSOCache在电脑中可以删除吗?
MSOCache文件夹在电脑中是可以删除的。但删除前需要了解以下几点: MSOCache文件夹的作用: MSOCache文件夹是Microsoft Office的本地安装源,用于存储Office安装和更新过程中所需的临时文件,如安装程序所需的组件、配置设置以及更新…...
数据网格和视图入门
WinForms数据网格(GridControl类)是一个数据感知控件,可以以各种格式(视图)显示数据。本主题包含以下部分,这些部分将指导您如何使用网格控件及其视图和列(字段)。 Grid Control’s…...
魔兽争霸3兼容性修复完全指南:让经典游戏在现代电脑上流畅运行
魔兽争霸3兼容性修复完全指南:让经典游戏在现代电脑上流畅运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在Windows …...
电网电压畸变也不怕:5分钟看懂SOGI-PLL如何让你的PWM整流器更稳定
电网电压畸变下的稳定之道:SOGI-PLL在PWM整流器中的实战解析 当电网电压出现谐波污染、频率波动或三相不平衡时,传统锁相环就像在暴风雨中航行的船只,难以保持稳定。而双二阶广义积分锁相环(DSOGI-PLL)则如同装备了先进稳定系统的现代舰艇&am…...
BarrageGrab:基于WebSocket直连架构的全平台直播弹幕实时采集技术栈
BarrageGrab:基于WebSocket直连架构的全平台直播弹幕实时采集技术栈 【免费下载链接】BarrageGrab 抖音快手bilibili直播弹幕wss直连,非系统代理方式,无需多开浏览器窗口 项目地址: https://gitcode.com/gh_mirrors/ba/BarrageGrab 在…...
SDX62平台编译Lighttpd时,Bitbake反复提示‘Reconnecting to server’怎么办?
SDX62平台编译Lighttpd时Bitbake连接问题的深度排查指南 当你在高通SDX62平台上使用Yocto构建系统编译Lighttpd时,突然遇到Bitbake反复提示"Reconnecting to server"的错误,这背后往往隐藏着更深层次的系统交互问题。作为嵌入式开发工程师&am…...
JTAG与SWD接口对比及2026年主流调试方案
JTAG与SWD接口核心异同对比 JTAG(Joint Test Action Group)和SWD(Serial Wire Debug)是ARM Cortex-M系列及许多现代微控制器最主流的两种片上调试接口。它们都基于IEEE 1149标准族,但设计理念和实现方式有显著差异。 …...
专业窗口调整工具:重新掌控你的Windows桌面布局
专业窗口调整工具:重新掌控你的Windows桌面布局 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer WindowResizer是一款基于C和MFC开发的免费开源工具,专门用于…...
PyTorch训练中断后恢复?手把手教你修复‘optimizer group size mismatch‘错误
PyTorch训练中断恢复实战:彻底解决优化器参数组不匹配问题 深夜的实验室里,显示器蓝光映照着你疲惫的脸庞——连续运行72小时的模型训练突然中断,而当你尝试从检查点恢复时,屏幕上赫然出现"optimizer group size mismatch&qu…...
AI开发者必抢的最后3套沙箱调试镜像!——基于Docker 25.0-rc1内核模块hook源码定制的4层隔离验证环境
更多请点击: https://intelliparadigm.com 第一章:AI开发者必抢的最后3套沙箱调试镜像!——基于Docker 25.0-rc1内核模块hook源码定制的4层隔离验证环境 为应对大模型推理链路中不可控的系统调用污染与CUDA上下文泄漏问题,我们基…...
Magenta.js核心组件深度解析:从MusicVAE到SketchRNN的完整实现
Magenta.js核心组件深度解析:从MusicVAE到SketchRNN的完整实现 【免费下载链接】magenta-js Magenta.js: Music and Art Generation with Machine Learning in the browser 项目地址: https://gitcode.com/gh_mirrors/ma/magenta-js Magenta.js是一个基于Ten…...
3分钟快速上手:AMD Ryzen处理器调试神器SMUDebugTool完整教程
3分钟快速上手:AMD Ryzen处理器调试神器SMUDebugTool完整教程 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: htt…...
