首页 > 其他分享 >记录一次Prism报错

记录一次Prism报错

时间:2024-04-22 21:34:02浏览次数:25  
标签:ShellModule 记录 void 应用程序 Prism 报错 视图 RequestNavigate

前提:我的WPF程序在进入主程序之前显示登录界面
此时不想登录,点击退出的时候报错了
报错提示

An exception occurred while initializing module 'ShellModule'. 
    - The exception message was: An exception has occurred while trying to add a view to region 'AsideRegion'. 
    - The most likely causing exception was was: 'Prism.Ioc.ContainerResolutionException: An unexpected error occurred while resolving 'Kstopa.Lx.EAP.Shell.Views.AsideMenuView'

源代码

 [Module(ModuleName = "ShellModule", OnDemand =true)]
 public class ShellModule : IModule
 {
     public void OnInitialized(IContainerProvider containerProvider)
     {
         var regionManager = containerProvider.Resolve<IRegionManager>();        
         regionManager.RegisterViewWithRegion(RegionNames.AsideRegion, typeof(AsideMenuView));      
         regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(HomeView)); 
     }
}

当程序关闭时,我写了

 private void ExcuteLogOut()
 {
     Application.Current.Shutdown();
 }

为什么代码会报错:
在上面的代码中,错误是在 ShellModule 的 OnInitialized 方法中发生的,这是因为在 LoginWindow 显示对话框并返回 false(表示用户取消登录)时,调用了 Application.Current.Shutdown();。在应用程序关闭的过程中,如果还有未完成的操作,如模块初始化中的视图注册,就可能会抛出异常。具体来说,ContainerResolutionException 表明在尝试解析 AsideMenuView 类型时出错,可能是因为在关闭应用程序时,依赖注入容器正在尝试创建或查找该视图的实例,但由于应用程序正在关闭,某些资源可能已经不可用。
解决方案1、将代码写在主程序的构造器

 public MainWindowViewModel(IUserService userService, IContainerProvider provider) : base(provider)
 {
       RegionManager.RegisterViewWithRegion(RegionNames.AsideRegion, typeof(AsideMenuView)); 
       RegionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(HomeView)); 
 }

改成写在 MainWindowViewModel 的构造器为什么不报错:
当你将视图注册的逻辑移动到 MainWindowViewModel 的构造函数中时,注册发生在 MainWindow 已经显示之后。这意味着视图注册是在应用程序的主要窗口和其依赖项都已正确初始化之后进行的。由于 MainWindow 是应用程序的主窗口,其视图模型的构造函数会在窗口加载后不久被调用,此时应用程序的生命周期尚未进入关闭阶段,因此不会遇到在模块初始化时尝试注册视图时发生的问题。
解决方案2、改成 RequestNavigate

 [Module(ModuleName = "ShellModule", OnDemand =true)]
 public class ShellModule : IModule
 {
     public void OnInitialized(IContainerProvider containerProvider)
     {
         var regionManager = containerProvider.Resolve<IRegionManager>();
         regionManager.RequestNavigate(RegionNames.ContentRegion, "HomeView");
         regionManager.RequestNavigate(RegionNames.AsideRegion, "AsideMenuView");
     }
}

使用 RequestNavigate 方法代替 RegisterViewWithRegion 时,导航请求是按需进行的。这意味着视图的创建和添加到区域是延迟的,直到用户实际导航到该视图。当你在 ShellModule 的 OnInitialized 方法中使用 RequestNavigate 时,你不是在注册视图类型,而是在请求 Prism 容器导航到特定的视图。这种方式下,视图的创建和添加是在用户与应用程序交互(如点击登录窗口的取消按钮)之后进行的,因此不会引起在应用程序关闭时尝试访问正在关闭的资源的问题。

综上所述,更改后的两种方法都避免了在应用程序关闭时尝试执行初始化或注册操作,这是导致原始错误的根本原因。将视图注册逻辑移至 MainWindowViewModel 或使用 RequestNavigate 都是在应用程序的生命周期中更安全的时间点执行相关操作,从而避免了异常的发生。
解决方案3、修改退出程序的方法
原本的退出为

 private void ExcuteLogOut()
 {
     Application.Current.Shutdown();
 }

3-1、传递参数Window

 private void ExcuteLogOut(Window win)
 {
     win.Close();
 }

3-2、即使不传递参数,查找此时显示的界面,去退出

 private void ExcuteLogOut()
 {
    var activeWindow = Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);
activeWindow?.Close();
 }

3-3、强制退出

 private void ExcuteLogOut()
 {
     Environment.Exit(0);
 }

标签:ShellModule,记录,void,应用程序,Prism,报错,视图,RequestNavigate
From: https://www.cnblogs.com/guchen33/p/18151594

相关文章

  • ROS1学习记录(1)
    学习视频:8.ROS命令行工具的使用_哔哩哔哩_bilibiliRSO指令:(1)rqt_graph :快速可视化节点关系在运行小海龟的时候可以再开一个终端就可以可视化两个节点之间关系;eg:上图可以看出从键盘节点输入信息最后运用在海龟图像节点上,这是他们之间的通讯关系,中间的/turtle1/cmd_vel就......
  • ARC176D 做题记录
    考场被创死了。套路,枚举值域\(i\),统计\(\lei\)和\(>i\)相邻的贡献。那么原排列对应一个\(01\)序列,其中\(0\)表示\(\lei\),\(1\)表示\(>i\)。然后拆贡献,考虑每个位置\(j(1\lej<n)\),\(j,j+1\)的组合有\(00,01,10,11\),我们只关心每次交换后的组合会怎么变。于是......
  • react native 安装app时报错 ”已安装了签名冲突的应用“
    1.问题描述:reactnative开发完app,手动安装app,报错”已安装了签名冲突的应用“。或者执行命令安装npxreact-nativerun-android--mode=release,报错2.解决方法:直接卸载原来的app发现无效,于是执行:adbuninstall"xxxxx"xxxxx换成你的app名,在这里可以找到:......
  • 记录如何用php做一个网站访问计数器的方法
    简介创建一个简单的网站访问计数器涉及到几个步骤,包括创建一个用于存储访问次数的文件或数据库表,以及编写PHP脚本来增加计数和显示当前的访问次数。方法以下是使用文件存储访问次数的基本步骤:创建一个文本文件来存储计数:在网站的根目录下创建一个名为counter.txt的文件,这个文......
  • 蓝牙打印开发代码示例(日拱一卒,有点进步,UUID仍报错)
     packagecom.lingrui.btprint;importandroid.Manifest;importandroid.app.AlertDialog;importandroid.bluetooth.BluetoothAdapter;importandroid.bluetooth.BluetoothDevice;importandroid.bluetooth.BluetoothSocket;importandroid.content.DialogInterface......
  • 使用pyppeteer 下载chromium 报错 python pyppeteer 调用谷歌翻译api
    https://registry.npmmirror.com/binary.html?path=chromium-browser-snapshots/Win_x64/手动下载安装包 修改文件C:\Users\luyan\AppData\Local\Programs\Python\Python312\Lib\site-packages\pyppeteer\chromium_downloader.py #修改这段代码defdownload_chromium()-......
  • 接口自动化Python+requests踩坑记录
    问题描述同一个接口,传参相同,用postman,jmeter等接口工具都能正常访问,后台也能正常返回数据,但是用requests.post()调用就会返回400jmeter传参以及响应这是一个登录接口,如图所示的传参,是可以正常登录的  postman传参以及响应可以看到,两个工具的传参不一样,但是也是同样可以正......
  • mysql添加数据报错
    1452-Cannotaddorupdateachildrow:aforeignkeyconstraintfails('db_student_manager_web'.'s_student',CONSTRAINT'student_clazz_id_foreign'FOREIGNKEY('clazz_id)REFERENCES's_clazz'('id')......
  • k8s node节点报错 dial tcp 127.0.0.1:8080: connect: connection refused
    前言在搭建好kubernetes环境后,master节点拥有control-plane权限,可以正常使用kubectl。但其他node节点无法使用kubectl命令,即使同步过去/root/.kube/config文件到各个node节点上,也不行。解决检查KUBECONFIG变量:确保KUBECONFIG环境变量正确设置。KUBECONFIG......
  • calico配置报错 kubelet.go:2855] "Container runtime network not ready"
    前言配置calico网络插件时,kubectlgetnode报错:NoReadykubectldescribenodenodeName:nodeRoles:<none>Labels:beta.kubernetes.io/arch=amd64beta.kubernetes.io/os=linuxkub......