Prism区域异常问题分析(导航失效?)
前文
本篇文章主要讨论在WPF当中使用Prism区域导航的失效的问题, 在其它的博客当中也出现了多次讨论这个问题以及对应的解决方法,
例如重写OnInitialized方法等等。我认为这都不是解决问题的根源, 既然如此, 下面我们将来分析Prism的IRegionManager的具体流程。
Prism初始化过程
首先, 我们分析一下下面的代码, 用于创建应用程序的主页
protected override Window CreateShell(){return Container.Resolve<MainWindow>();}
那么, 在这个MainWindow当中, 如果我们定于以下一个区域, 则可以使用IRegionManager进行导航操作, 如下所示:
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ShowRegion" />
现在问题就来了, 一旦我们把这个窗口的实例销毁, 自己重新创建一个MainWindow的时候, 你会发现你无法进行导航了, 这个时候就是大家理解的那个问题, 是Region失效了?
并不是, 为了解决这个问题, 我们需要了解Prism框架本身做了什么动作, 查看源代码之后, 发现以下初始化代码:
var shell = CreateShell(); if (shell != null){MvvmHelpers.AutowireViewModel(shell);RegionManager.SetRegionManager(shell, _containerExtension.Resolve<IRegionManager>());RegionManager.UpdateRegions();InitializeShell(shell);}
了解到, 从一开始获取到MainWindow之后, 陆续进行了上下文绑定, 设置IRegionManager实例以及更新区域的操作。
在这里, 我们至少了解了几个东西。
MainWindow的DataContext初始化的时机
MainWindow窗口当中IRegionManager的初始化过程
区域刷新的动作
完成了这些动作之后, 最终ShowDialog展示了首页, 于是,我们可以在这里愉快的使用IRegionManager进行导航操作。
分析结果
如果想要实现在某个窗口当中进行导航, 除了定义区域之外, 你还需要做的就是给窗口设置IRegionManager的实例以及刷新区域, 核心就是这两行代码:
RegionManager.SetRegionManager(shell, _containerExtension.Resolve<IRegionManager>());RegionManager.UpdateRegions();
既然我们了解到这个之后, 还有一个问题也顺其自然的解决了, 在Prism当中使用弹窗服务不能导航的问题, 因为在Prism框架提供的IDialogService中并没有实现
设置IRegionManager以及刷新区域, 这就是问题的根源, 所以我们必须手动的去修改实现达到支持导航的功能。
弹窗中实现导航
示例: 以下代码, 展示了如何在弹窗当中设置区域以及刷新区域的问题。
var provider = ContainerLocator.Container.Resolve<IContainerProvider>();var regionManager = ContainerLocator.Container.Resolve<IRegionManager>();var win = provider.Resolve<object>("ShowWindow");if (win is Window view){RegionManager.SetRegionManager(view, regionManager);RegionManager.UpdateRegions();view.ShowDialog();}
当然, 你完全可以自行实现IDialogService接口覆盖Prism提供的内部实现, 以达到弹窗支持导航的行为, 例如:
public interface IMyDialogService : IDialogService{}public class MyDialogService : DialogService, IMyDialogService{public MyDialogService(IContainerExtension containerExtension): base(containerExtension){}public new void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback){//...}}
总结
对于任何窗口, 我们都可以使用IRegionManager进行导航操作, 在第一次框架初始化的时候, 只不过是Prism内部帮我们处理了区域的设置以及刷新行为。
而如何我们想在其它地方使用区域导航, 则需要手动设置区域以及刷新区域即可。
Prism区域异常问题分析(导航失效?)相关推荐
- C++ 异常机制分析
C++ 异常机制分析 参考文章: (1)C++ 异常机制分析 (2)https://www.cnblogs.com/QG-whz/p/5136883.html 备忘一下.
- 二月技术通讯.pdf丨核心数据库一波三折异常重启分析
每月关注:55 页 干货,汇总一个月数据库行业热点事件.新的产品特性,包括重要数据库产品发布.警报.更新.新版本.补丁等. 亲爱的读者朋友: 为了及时共享行业案例,通知共性问题,达成共享和提前预防,以 ...
- php js 报错信息,JavaScript中错误异常的分析(附示例)
本篇文章给大家带来的内容是关于JavaScript中错误异常的分析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我的建议是不要隐藏错误,勇敢地抛出来.没有人会因为代码出现 ...
- 基于UEBA的用户上网异常行为分析
1. 引言 1.1 项目介绍 ✅ 随着企业信息化水平的不断提升,数据作为一种资产成为越来越多企业的共识,企业在产业与服务.营销支持.业务运营.风险管控.信息纰漏等生产.经营.管理活动中涉及到大量的商业 ...
- CCF的基于UEBA的用户上网异常行为分析baseline(线上0.9263)
基于UEBA的用户上网异常行为分析 比赛地址链接:https://www.datafountain.cn/competitions/520 数据: 代码: import pandas as pd im ...
- 2021 CCF基于UEBA的用户上网异常行为分析baseline线上0.90
2021CCF BDCI 今年CCF又来了,每年都有大佬选手夺冠,也有黑马新人突出重围,对于新人来说一份baseline是很好的起点,可以更快入门数据竞赛.(大佬请忽略!!!) 基于UEBA的用户上网 ...
- winform 两个区域保持固定距离_【麻辣烫】川渝区域零担十强分析:余氏东风、力展、宇鑫、金泓达快运、长吉、西部风、海风快运、绍平、迪丰、健隆......
西部大开发20年,川渝已成西部经济高点,在物流行业被当作西南唯一的产粮区深度挖掘,其实当地的区域网零担行业发展同样繁荣. 来源 | 运联传媒(ID:tucmedia) 作者 | 运联研究院 聂树军 原 ...
- Java遍历List和Map出现ConcurrentModificationException异常原因分析及解决方法
Java遍历 List 和 Map 出现 ConcurrentModificationException 异常原因分析及解决方法 一.单线程 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误 ...
- linux vip切换后不通,keepalived主备节点都配置vipvip切换异常案例分析
keepalived主备节点都配置vipvip切换异常案例分析 keepalived主备节点都配置vip,vip切换异常案例分析 故障现象:主机名director-Adirector-B IP192. ...
最新文章
- Android Paint
- java命名$_java命名规范
- 为什么textbox 得不到更改后的值
- recyclerview item动画_RecyclerView 的 Item 酷炫动画,效果加案例讲解!
- 亿级短视频社交美拍架构实践
- 回馈粉丝,包邮送一台全新iPad
- 如何使用 controllerExtensions 给 SAP Fiori Elements List Report 的表格注册事件响应函数
- db2和mysql语句区别_db2和mysql语法的区别是什么
- 5.报错:ImportError: No module named win32api
- [html] 举例说明图片懒加载的方案有哪些?
- .net连接MYSQL数据库方法一
- 国内网络安全风险评估市场与技术操作
- Atitit websocket 使用大概总结 使用场景 websocket 实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应 用 实时数据可以用来更新缓存
- PDF查看器之pdfvuer
- 淘宝上的零食能买吃吗?网上进口食品的秘密。
- 计算机配件内存计入什么科目,机器配件应计入什么会计科目?
- EasyPoi 实现Word文档内容替换3种情况(正常文本替换、表格文本替换、图表替换)
- 微信小程序 - 小技巧
- python confluent_kafka 关于消费者消费时间过长,导致的leave group
- mysql sphinx 中文搜索_MySQL中文全文搜索用迅搜还是Sphinx?
热门文章
- 设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code
- 通才和专家:如何选择
- 构建和实现单点登录解决方案(转载于IBMdeveloperWorks)
- UIView中常用的方法
- chromebook刷机_如何从Chromebook上的APK侧面加载Android应用
- java获取前端json数据_java如何获取前端ajax传来的json对象
- (原創) 今天拿到學生證了 (日記)
- 数据库分库分表、读写分离的原理和实现,以及使用场景
- 二 面向对象三大特性
- Vue根据菜单json数据动态按需加载路由Vue-router