经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
WPF/C#:程序关闭的三种模式
来源:cnblogs  作者:mingupupup  时间:2024/6/12 16:15:07  对本文有异议

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

  1. <Window x:Class="ApplicationShutdown.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:ApplicationShutdown"
  7. mc:Ignorable="d"
  8. Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_Loaded">
  9. <DockPanel>
  10. <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
  11. <Label HorizontalAlignment="Left">Shutdown Mode:</Label>
  12. <ComboBox HorizontalAlignment="Left" Name="shutdownModeListBox" />
  13. </StackPanel>
  14. <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
  15. <Label HorizontalAlignment="Left">Application Exit Code (for explicit shutdown):</Label>
  16. <TextBox HorizontalAlignment="Left" Name="appExitCodeTextBox">0</TextBox>
  17. </StackPanel>
  18. <Button DockPanel.Dock="Top" Click="newWindowButton_Click">New Window</Button>
  19. <Button DockPanel.Dock="Top" Click="explicitShutdownButton_Click">Shutdown Explicitly (Passing Exit Code)</Button>
  20. <Canvas />
  21. </DockPanel>
  22. </Window>

MainWindow的cs如下:

  1. using System;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. namespace ApplicationShutdown
  5. {
  6. /// <summary>
  7. /// Interaction logic for MainWindow.xaml
  8. /// </summary>
  9. public partial class MainWindow : Window
  10. {
  11. public MainWindow()
  12. {
  13. InitializeComponent();
  14. }
  15. private void MainWindow_Loaded(object sender, RoutedEventArgs e)
  16. {
  17. shutdownModeListBox.Items.Add("OnLastWindowClose");
  18. shutdownModeListBox.Items.Add("OnExplicitShutdown");
  19. shutdownModeListBox.Items.Add("OnMainWindowClose");
  20. shutdownModeListBox.SelectedValue = "OnLastWindowClose";
  21. shutdownModeListBox.SelectionChanged +=
  22. shutdownModeListBox_SelectionChanged;
  23. Application.Current.ShutdownMode = ShutdownMode.OnLastWindowClose;
  24. }
  25. private void shutdownModeListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
  26. {
  27. Application.Current.ShutdownMode =
  28. (ShutdownMode) Enum.Parse(typeof (ShutdownMode), shutdownModeListBox.SelectedValue.ToString());
  29. }
  30. private void newWindowButton_Click(object sender, RoutedEventArgs e)
  31. {
  32. (new ChildWindow()).Show();
  33. }
  34. private void explicitShutdownButton_Click(object sender, RoutedEventArgs e)
  35. {
  36. var exitCode = 0;
  37. int.TryParse(appExitCodeTextBox.Text, out exitCode);
  38. Application.Current.Shutdown(exitCode);
  39. }
  40. }
  41. }

ChildWindow的xaml如下:

  1. <Window x:Class="ApplicationShutdown.ChildWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:ApplicationShutdown"
  7. mc:Ignorable="d"
  8. Title="ChildWindow" Height="300"
  9. Width="300"
  10. Closing="ChildWindow_Closing"
  11. Closed="ChildWindow_Closed">
  12. <Grid/>
  13. </Window>

ChildWindow的cs如下:

  1. using System;
  2. using System.ComponentModel;
  3. using System.Windows;
  4. namespace ApplicationShutdown
  5. {
  6. /// <summary>
  7. /// Interaction logic for ChildWindow.xaml
  8. /// </summary>
  9. public partial class ChildWindow : Window
  10. {
  11. public ChildWindow()
  12. {
  13. InitializeComponent();
  14. }
  15. private void ChildWindow_Closing(object sender, CancelEventArgs e)
  16. {
  17. Console.WriteLine(@"Closing");
  18. var result = MessageBox.Show("Allow Shutdown?", "Application Shutdown Sample",
  19. MessageBoxButton.YesNo,
  20. MessageBoxImage.Question);
  21. e.Cancel = (result == MessageBoxResult.No);
  22. }
  23. private void ChildWindow_Closed(object sender, EventArgs e)
  24. {
  25. Console.WriteLine(@"Closed");
  26. }
  27. }
  28. }

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)

原文链接:https://www.cnblogs.com/mingupupu/p/18243656

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号