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如下:

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如下:

csharp 复制代码
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如下:

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如下:

csharp 复制代码
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)

相关推荐
野生技术架构师2 小时前
一线大厂Java面试八股文全栈通关手册(含源码级详解)
java·开发语言·面试
Q一件事2 小时前
R语言制图-相关性及关系网络图
开发语言·r语言
坊钰3 小时前
Java 死锁问题及其解决方案
java·开发语言·数据库
551只玄猫4 小时前
【数学建模 matlab 实验报告1】
开发语言·数学建模·matlab·课程设计·实验报告
三道渊5 小时前
C语言:文件I/O
c语言·开发语言·数据结构·c++
hnlgzb5 小时前
安卓app kotlin语法,Hilt是什么东西?
android·开发语言·kotlin
没用的阿_吉5 小时前
windows10 Qt5.15.14 msvc2019 编译部署
开发语言·qt
聊聊MES那点事5 小时前
JavaScript图表控件AG Charts使用教程:使用AG Charts React实时更新柱状图
开发语言·javascript·react.js·图表控件
ywf12155 小时前
Go基础之环境搭建
开发语言·后端·golang
biubiubiu07065 小时前
Python 环境安装与 Linux 控制入门
linux·开发语言·python