前文

本篇文章主要讨论在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区域异常问题分析(导航失效?)相关推荐

  1. C++ 异常机制分析

    C++ 异常机制分析 参考文章: (1)C++ 异常机制分析 (2)https://www.cnblogs.com/QG-whz/p/5136883.html 备忘一下.

  2. 二月技术通讯.pdf丨核心数据库一波三折异常重启分析

    每月关注:55 页 干货,汇总一个月数据库行业热点事件.新的产品特性,包括重要数据库产品发布.警报.更新.新版本.补丁等. 亲爱的读者朋友: 为了及时共享行业案例,通知共性问题,达成共享和提前预防,以 ...

  3. php js 报错信息,JavaScript中错误异常的分析(附示例)

    本篇文章给大家带来的内容是关于JavaScript中错误异常的分析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我的建议是不要隐藏错误,勇敢地抛出来.没有人会因为代码出现 ...

  4. 基于UEBA的用户上网异常行为分析

    1. 引言 1.1 项目介绍 ✅ 随着企业信息化水平的不断提升,数据作为一种资产成为越来越多企业的共识,企业在产业与服务.营销支持.业务运营.风险管控.信息纰漏等生产.经营.管理活动中涉及到大量的商业 ...

  5. CCF的基于UEBA的用户上网异常行为分析baseline(线上0.9263)

    基于UEBA的用户上网异常行为分析 比赛地址链接:https://www.datafountain.cn/competitions/520 数据: 代码: import pandas as pd im ...

  6. 2021 CCF基于UEBA的用户上网异常行为分析baseline线上0.90

    2021CCF BDCI 今年CCF又来了,每年都有大佬选手夺冠,也有黑马新人突出重围,对于新人来说一份baseline是很好的起点,可以更快入门数据竞赛.(大佬请忽略!!!) 基于UEBA的用户上网 ...

  7. winform 两个区域保持固定距离_【麻辣烫】川渝区域零担十强分析:余氏东风、力展、宇鑫、金泓达快运、长吉、西部风、海风快运、绍平、迪丰、健隆......

    西部大开发20年,川渝已成西部经济高点,在物流行业被当作西南唯一的产粮区深度挖掘,其实当地的区域网零担行业发展同样繁荣. 来源 | 运联传媒(ID:tucmedia) 作者 | 运联研究院 聂树军 原 ...

  8. Java遍历List和Map出现ConcurrentModificationException异常原因分析及解决方法

    Java遍历 List 和 Map 出现 ConcurrentModificationException 异常原因分析及解决方法 一.单线程 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误 ...

  9. linux vip切换后不通,keepalived主备节点都配置vipvip切换异常案例分析

    keepalived主备节点都配置vipvip切换异常案例分析 keepalived主备节点都配置vip,vip切换异常案例分析 故障现象:主机名director-Adirector-B IP192. ...

最新文章

  1. Android Paint
  2. java命名$_java命名规范
  3. 为什么textbox 得不到更改后的值
  4. recyclerview item动画_RecyclerView 的 Item 酷炫动画,效果加案例讲解!
  5. 亿级短视频社交美拍架构实践
  6. 回馈粉丝,包邮送一台全新iPad
  7. 如何使用 controllerExtensions 给 SAP Fiori Elements List Report 的表格注册事件响应函数
  8. db2和mysql语句区别_db2和mysql语法的区别是什么
  9. 5.报错:ImportError: No module named win32api
  10. [html] 举例说明图片懒加载的方案有哪些?
  11. .net连接MYSQL数据库方法一
  12. 国内网络安全风险评估市场与技术操作
  13. Atitit websocket 使用大概总结 使用场景 websocket 实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应 用 实时数据可以用来更新缓存
  14. PDF查看器之pdfvuer
  15. 淘宝上的零食能买吃吗?网上进口食品的秘密。
  16. 计算机配件内存计入什么科目,机器配件应计入什么会计科目?
  17. EasyPoi 实现Word文档内容替换3种情况(正常文本替换、表格文本替换、图表替换)
  18. 微信小程序 - 小技巧
  19. python confluent_kafka 关于消费者消费时间过长,导致的leave group
  20. mysql sphinx 中文搜索_MySQL中文全文搜索用迅搜还是Sphinx?

热门文章

  1. 设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code
  2. 通才和专家:如何选择
  3. 构建和实现单点登录解决方案(转载于IBMdeveloperWorks)
  4. UIView中常用的方法
  5. chromebook刷机_如何从Chromebook上的APK侧面加载Android应用
  6. java获取前端json数据_java如何获取前端ajax传来的json对象
  7. (原創) 今天拿到學生證了 (日記)
  8. 数据库分库分表、读写分离的原理和实现,以及使用场景
  9. 二 面向对象三大特性
  10. Vue根据菜单json数据动态按需加载路由Vue-router