WPF/C#:程序关闭的三种模式

news/2024/10/4 11:28:26

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方法时,应用程序才会关闭。

借助图解更好理解:

image-20240611114947884

代码来源

[WPF-Samples/Application Management/ApplicationShutdown at main · microsoft/WPF-Samples (github.com)](https://github.com/microsoft/WPF-Samples/tree/main/Application Management/ApplicationShutdown)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/44448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

在WEPAPI接口无法查询物料分组

数据分组仅有业务对象没有实体表, 所以接口不能直接访问数据分组BOS_FORMGROUP通过表名反查业务对象标识, 接口中使用查询到的业务对象标识可正常查询到数据. 注意: 可能存在分组没有对应的业务对象的情况, 此时需要新建业务对象并设置对应的分组表.

Si24R05—高度集成的低功耗 2.4G+125K SoC 芯片

Si24R05是一款高度集成的低功耗SoC芯片,具有低功耗、Low Pin Count、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、无线收发器、3D低频唤醒接收器等丰富的外设。内核采用RISC-V RV32IMAC(2.6 CoreMark/MHz)。Si24R05提供了配…

龙哥量化:通达信倚天出鞘主图指标公式源码

如果您需要代写公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889 涨停:=C/REF(C,1)>1.0970 AND C=H AND C/REF(C,1)< 1.11;STICKLINE(涨停,O,C,2,0),COLORYELLOW;跌停:=C/REF(C,1)< 0.913 AND C=L;STICKLINE(跌停,O,C,2,0),COLORGREEN;周期:=BArslAST(REF(…

vue tree展开自动获取焦点

打开弹窗设置默认焦点 html代码 重点: 设置 node-key="id" ref="table_dedh"<el-tree :data="dedhtreeData" node-key="id" ref="table_dedh" :props="{ children: children, label: label}" @node-click=&qu…

龙哥量化:通达信过阴阳选股指标公式源码

如果您需要代写公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889A1:=MA(CLOSE,5);A2:=MA(CLOSE,10);A3:=MA(CLOSE,20);A4:=MA(CLOSE,60);多头排列:=CLOSE>A1 AND A1>A2 AND A2>A3 AND CLOSE>OPEN;持续放量:=EVERY(VOL>=REF(VOL,1),2);量大价涨:=V>…

复数的矩阵表示

复数 复数\(z\)定义:\(a+bi\) 其中\(a,b∈R\),\(i^2=-1\),\(i\)又称为圆复数(虚数)单位,\(a\)为实部\(Re(z)=a\),\(b\)为虚部\(Im(z)=b\),复数域记作\(C\) 0.复数三角形式和指数形式\(z=a+bi = r(cos\theta +i sin\theta) = re^{i\theta}\)1.复数域是实数域的代数(加法…

ubuntu24 安装

地址:https://cdimage.ubuntu.com/ubuntu/releases/24.04/release/ 按回车看具体信息 等待 仍然等待,我大概用时20分钟,出现以下画面回车返回,出现下下个画面按“reboot now“ 之后可能有个fail 的画面,按回车就好 。 按回车或者等待 出现login 信息。填写之前设置的 完…

一个很有意思的excel计算错误

工作多年,好多年没有写blog了。今天发现了个很有意思的计算错误想写一下。写报告的时候习惯性用计算器算了一下,发现数据不对,311.3*24=7471.20.但是我这个表计算出来是7471.30,我用的是excel的自动求和 A1*24这样的公式。 很奇怪因为这是excel的自动计算,按道理不会出现…