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#:程序关闭的三种模式的更多相关文章
- 操作系统实战45讲笔记- 05 CPU工作模式:程序执行的三种模式
实模式 实模式又称实地址模式,实,即真实,这个真实分为两个方面,一个方面是运行真实的指令,对指令的动作不作区分,直接执行指令的真实功能,另一方面是发往内存的地址是真实的,对任何地址不加限制地发往内存. ...
- VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
VMware虚拟机上网络连接(network type)的三种模式--bridged.host-only.NAT VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换 ...
- SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled) 几种模式之间的转换
http://blog.sina.com.cn/s/blog_5aee9eaf0100y44q.html 在CentOS6.2 中安装intel 的c++和fortran 的编译器时,遇到来一个关于S ...
- 辛星跟您玩转vim第一节之vim的下载与三种模式
首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...
- hadoop学习;自己定义Input/OutputFormat;类引用mapreduce.mapper;三种模式
hadoop切割与读取输入文件的方式被定义在InputFormat接口的一个实现中.TextInputFormat是默认的实现,当你想要一次获取一行内容作为输入数据时又没有确定的键.从TextInpu ...
- 逐步搭建Lamp环境之vim的三种模式以及基本命令
在Linux中vim的三种模式分别为:命令模式.末行模式.编辑模式.以下是三者的关系图: 三种模式的彼此切换: 命令模式是vim中的默认模式. 命令模式切换至末行模式: 使用英文冒号(:). 末行模式 ...
- 应用负载均衡之LVS(一):基本概念和三种模式
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- httpd的三种模式比较
查看你的httpd使用了哪种模式: /usr/local/apache2/bin/httpd -V |grep 'Server MPM' 使用哪种模式,需要在编译的时候指定 --with-mpm=pr ...
- LVS(一):基本概念和三种模式
网站架构中,负载均衡技术是实现网站架构伸缩性的主要手段之一.所谓"伸缩性",是指可以不断向集群中添加新的服务器来提升性能.缓解不断增加的并发用户访问压力. 负载均衡有好几种方式:h ...
- 【转载】DDD分层架构的三种模式
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...
随机推荐
- 轻松处理高于平常10倍的视频需求,还能节省60%的IT成本,蓝墨做对了什么?
近年来,Serverless 一直在高速发展,并呈现出越来越大的影响力.主流的云服务商也在不断地丰富云产品体系,提供更好的开发工具,更高效的应用交付流水线,更好的可观测性,更细腻的产品间集成,但一切才 ...
- es实战-使用IK分词器进行词频统计
简介:通过IK分词器分词并生成词云. 本文主要介绍如何通过 IK 分词器进行词频统计.使用分词器对文章的词频进行统计,主要目的是实现如下图所示的词云功能,可以找到文章内的重点词汇.后续也可以对词进行 ...
- [Blockchain] Cosmos Starport 101 - 为你的新数据类型 生成代码
# 项目模板 $ starport app github.com/hello/planet --address-prefix your_new_prefix 项目目录结构的说明看这里: https:/ ...
- Vue2源码解析-源码调试与核心流程梳理图解
现在VUE3已经有一段时间了,也慢慢普及起来了.不过因为一直还在使用VUE2的原因还是去了解和学了下它的源码,毕竟VUE2也不会突然就没了是吧,且VUE3中很多原理之类的也是类似的.然后就准备把VUE ...
- LVGL学习资料
一.资料整理 官网:https://lvgl.io/ 使用手册: 官方的使用手册是英文版的,百问网将其翻译成中文版的文档.地址如下: 官方使用文档:https://docs.lvgl.io/maste ...
- java引入jep实现四则运算包含负数且规范两位小数
1.在pom中引入依赖 <!--四则运算--> <dependency> <groupId>jep</groupId> <artifactId&g ...
- golang 常用操作
golang 获取切片 slice 第一个 最后一个 元素 复合数据类型切片通常用作Go中索引数据的口语结构. 该类型[]intSlice是具有类型为integer的元素的切片. len函数用于获取切 ...
- ansible(9)--ansible的yum模块
1. yum模块 功能:管理软件包,需要确认被管理端为红帽系列的,并且需要被管理端配置好yum源. 主要的参数如下: 参数 说明 name 指定安装软件包名或软件包URL state 指定yum对应的 ...
- Nifi:Nifi中的Controller Service
Service简介 首先Nifi中的Controller Service 和我们MVC概念中的Controller Service不是一个概念,Nifi中的Controller Service更像是和 ...
- pageoffice 6 实现word文件添加水印
在很多场景下,Word文档正式发文之前,或者说形成最终文档之前,常常需要往Word文件中添加水印,并且会根据文件类型或内容的不同,需要添加的水印也不一样. 添加水印是Word软件里的一个简单功能,直接 ...