【wpf】Application与AppDomain(未完成,待完善)

2024-01-21 06:48

本文主要是介绍【wpf】Application与AppDomain(未完成,待完善),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Application 实现单一实例模式,以提供对其窗口、属性和资源范围服务的共享访问权限。 因此,每个 AppDomain(应用程序域)中仅且只有一个 Application 实例存在。

我们在写WPF的程序的时候,你根本没有创建Application与AppDomain的对象,但是你已经可以使用它们的对象了。

跳到App内部,可以看到如下代码(这段代码是VS自动生成的)。

这让我想到了MFC中的theApp,它管理了整个应用程序的流程。

继承关系:

Application 是封装 WPF 应用程序特定功能的类,包括:

  • 应用程序生存期:Activated、、Current、、RunSessionEndingDeactivatedExitShutdownDispatcherUnhandledException、。 StartupShutdownMode

  • 应用程序范围窗口、属性和资源管理:FindResource、、GetContentStream、、GetResourceStream、LoadComponent、MainWindowProperties、Resources、StartupUri。 Windows

  • 命令行参数和退出代码处理:Application.Startup、、Application.ExitApplication.Shutdown。

  • 导航:FragmentNavigation、、LoadCompleted、Navigated、NavigationProgressNavigating、NavigationStoppedNavigationFailed、、SetCookie。 GetCookie

 AppDomain 像是Application的运行容器。一个进程可以创建多个AppDomain。AppDomain一般用于插件模式。这样主程序可以动态的加载可卸载其他AppDomain(插件),插件的崩溃也不会影响主程序。


下面是Application 和  AppDomain  常用的一些地方的小结:

Application 和  AppDomain  可用于,全局异常捕获!我们自定义的异常也是可以捕获到。

public App(){//UI线程异常this.DispatcherUnhandledException += App_DispatcherUnhandledException;//非UI线程异常AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;}/// <summary>/// UI线程异常/// </summary>/// <param name="sender"></param>/// <param name="e"></param>/// <exception cref="NotImplementedException"></exception>private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e){e.Handled = true; // 消息不再继续往下流了(会流到,CurrentDomain_UnhandledException 非UI线程异常处理)string msg = e.Exception.Message;string func_name = e.Exception.TargetSite.Name;string str_err = $"错误信息:{msg},| 调用方法:{func_name}";logger.Error(str_err);MessageBox.Show(str_err);//throw new NotImplementedException();}/// <summary>/// 非UI线程异常/// </summary>/// <param name="sender"></param>/// <param name="e"></param>/// <exception cref="NotImplementedException"></exception>private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e){logger.Error(e.ExceptionObject);throw new NotImplementedException();}

如果想在子线程里,更新界面信息,我们可以用到Application.Current.Dispatcher

在WPF中,所有的WPF对象都派生自DispatcherObject,DispatcherObject暴露了Dispatcher属性用来取得创建 对象线程对应的Dispatcher。DispatcherObject对象只能被创建它的线程所访问,其他线程修改 DispatcherObject需要取得对应的Dispatcher,调用Invoke或者BeginInvoke来投入任务。(Invoke和BeginInvoke等从WinForm时代就是一直存在的,WPF使用了Dispatcher来封装这些线程级的操作。原理和就是WINAPI中的PostMessage)

        private void GuiHandler(){ushort CardID = 0;while (LoopGui){Application.Current.Dispatcher.BeginInvoke(new Action(() =>{// 改变界面UI// 相当于将更新消息投递到,界面处理消息队列}));Thread.Sleep(500);}}

在程序的任何地方调用System.Windows.Application.Current(Application类型),都能得到app对象,不过记得将其转换成我们自己的App的类型!

这篇关于【wpf】Application与AppDomain(未完成,待完善)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628686

相关文章

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

python安装完成后可以进行的后续步骤和注意事项小结

《python安装完成后可以进行的后续步骤和注意事项小结》本文详细介绍了安装Python3后的后续步骤,包括验证安装、配置环境、安装包、创建和运行脚本,以及使用虚拟环境,还强调了注意事项,如系统更新、... 目录验证安装配置环境(可选)安装python包创建和运行Python脚本虚拟环境(可选)注意事项安装

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要