WPF APP生命周期和全局异常捕获

应用启动事件与启动参数

属性查找

选择想要控件的事件,可以在控件上鼠标右击选择属性,在右上角点击闪电符号即可看到这个控件的所有事件:

APP.Run()启动方法:

打开项目中这个文件:

".....\XH.EventLesson\obj\Debug\net7.0-windows\App.g.i.cs"

APP启动事件:

需求:当程序运行的时候 exe 传递参数 dotnet run .....

更新:更新程序不允许双击打开 主程序获取更新列表提交到更新程序

Main.exe 需要收参数

调试版本(更多的日志输出)/生产版本(执行效率)

业务场景:应用独立启动 不允许多开,可以在这里检查进程

复制代码
public App()
{
    // APP 启动的时候 触发
    this.Startup += App_Startup;
}
 private void App_Startup(object sender, StartupEventArgs e)
 {
     MessageBox.Show(string.Join(',',e.Args));
 }
在启动APP的时候,传参方法:
  1. 打开项目属性--> 调试--> 打开调试启动配置文件 UI

设置想要穿的参数即可

启动项目时候,会有:看到参数过来了

  1. 使用命令行 :打开应用程序目录 cmd 输入项目名 + 后面的参数
  1. 命令行也可以包装为bat文件
  2. 创建快捷方式,在快捷方式目标后面添加参数:

应用退出事件

Exit APP退出事件

作用域:整个APP,在App.xaml中写

需求:一般在APP关闭之前,完成所有的日志记录 和 数据保存

复制代码
public App()
{
    // APP 退出时触发
    this.Exit += App_Exit;
}
private void App_Exit(object sender, ExitEventArgs e)
{
    // 日志记录 数据保存
    Debug.WriteLine("APP---Exit");
}

注意

如果没有任何窗口运行 则启用这个方法 退出

杀进程 不调用此方法

Close() 窗口关闭事件

作用域:当前窗口

需求:需要关闭当前弹窗/窗口

复制代码
private void Button_Click(object sender, RoutedEventArgs e)
{
    // 当前页面退出
    this.Close();
}
Application.Current.Shutdown() APP退出事件

作用域:整个APP,在使用的地方写

需求:一般在退出的时候写,这个退出之前,执行APP的Exit事件

复制代码
private void Button_Click1(object sender, RoutedEventArgs e)
{
    // APP 退出
    Application.Current.Shutdown();
}
System.Environment.Exit(0) 杀死进程

作用域:整个APP,在使用的地方写

需求:在有不可以退出,有线程的地方写

注意:杀进程不调用APP的Exit方法,会导致数据丢失

复制代码
 private void Button_Click2(object sender, RoutedEventArgs e)
 {
     // 系统环境退出 杀进程 不执行App_Exit事件
     System.Environment.Exit(0);
 }
SessionEnding 操作系统退出
复制代码
public App()
{
    // 操作系统退出的时候触发
    this.SessionEnding += App_SessionEnding;
}
 private void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
 {
     // 操作系统关闭时触发
     // 关闭电脑是 弹出 仍要关闭/取消 按钮
     e.Cancel = true;
 }

关闭电脑是 弹出 仍要关闭/取消 按钮

全部异常捕获

复制代码
public App()
{
    // Dispatche UI 线程 未被处理的异常 最后一道关卡 
    this.DispatcherUnhandledException += App_DispatcherUnhandledException;
    // 全局处理 全局捕获异常 但是不可以捕获Task的异常
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    // 处理Task没有捕获到全局异常
    TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
}
// 在垃圾回收机制触发的时候,才能捕捉到Task异常
private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e)
{
    // 
}
// 全局处理异常 不可以捕获Task
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // 可以记录下日志
}
// 处理UI异常
private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    MessageBox.Show(e.Exception.Message);
}
相关推荐
samble1 天前
从零搭建半导体设备上位机(九):拖拽与交互,Adorner、DragDrop 与晶圆拖放信息
wpf·拖拽·adorner
郝学胜-神的一滴3 天前
AI 编程智能体 27:吃透MCP通信机制
人工智能·python·langchain·wpf·numpy·scikit-learn
波力海苔夹心脆6754 天前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
陈仓主教4 天前
# WPF CheckBox 控件详解与使用—WPF 中的控件(6)--复选框控件(CheckBox)
wpf
光泽雨6 天前
WPF 音视频四大核心方案对比
wpf·音视频
浪扼飞舟6 天前
WPF(数据绑定)
wpf
samble7 天前
从零搭建半导体设备上位机(四):单实例、启动流程与配置文件,App 里那 526 行到底在干什么
wpf·配置文件·单实例
浪扼飞舟8 天前
WPF(控件的继承树、内容控件、布局控件)
wpf
avi911111 天前
电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf
android·wpf·框架·数据爬虫·meego·电影管理
吾与谁归in12 天前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf