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内部帮我们处理了区域的设置以及刷新行为。
而如何我们想在其它地方使用区域导航, 则需要手动设置区域以及刷新区域即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HOOK学习笔记与心得

一、 Hook介绍钩子(Hook)&#xff0c;是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息&#xff0c;而且所监视的窗口可以是其他进程所创建的。当消息到达后&#xff0c;在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理wind…

使用SQLServer2005插入一条数据时返回当前插入数据的ID

使用SQLServer2005插入一条数据时返回当前插入数据的ID在执行完插入后 再执行 select identity from users 就OK 就是刚才插入的那行的 ID了 补充&#xff1a; identity 表示当前新增的主键ID这个是在一个session中查找的&#xff0c;SELECT MAX(id) FROM Users 执行这个查询,就…

access函数_ACCESS中的DLookUp函数是如何运算的?

​一、DLookUp函数介绍1. DLookUp函数的用途&#xff1a;可以用于从指定集合(一个域)中获取符合条件的特定字段的值。2. DLookUp函数的格式为&#xff1a;DLookUp( expr , domain , [criteria] )其中&#xff1a;expr 为字段名&#xff0c;或以字段名为基础的表达式字符串domai…

atitit。wondows 右键菜单的管理与位置存储

atitit。wondows 右键菜单的管理与位置存储 原理 。这样的功能称为Windows外壳扩展(Shell Extensions) 1 常用右键菜单 atiContentMenu1 通用tool1 文件夹的右键菜单位置3 所有的文件的右键菜单位置3 右键菜文件夹模式3 原理 。这样的功能称为Windows外壳扩展(Shell Extensions…

汇编语言之基础知识

1、机器语言 说到汇编语言的产生&#xff0c;首先要讲一下机器语言。机器语言是机器指令的集合。什么是机器指令&#xff1f;我们在使用CE时&#xff0c;常常见到。 请看下图&#xff1a; 图中所示的就是机器指令&#xff08;或称机器码&#xff09;&#xff0c;这是十六进制的…

Entity Framework 简单增删改操作

前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作&#xff0c;现在主要来学习一下简单的增加、删除、修改操作。 增加 在EF中添加操作一般有两种方式&#xff1a;一是直接创建对象&#xff0c;然后调用“DbSet”的”Add()”…

华为云服务器初探二(完结)

在上一篇《华为云服务器初探》 中介绍了在使用华为云服务器部署时的一些关键点&#xff0c;本篇继续&#xff0c;内容涉及如下:中间件的部署问题解决NAT 网关使用数据库服务的访问dotNET Core 程序的构建Redis首先更正上一篇中的一个错误&#xff0c;在运行参数中进行密码设置&…

C# 对Datatable排序

一&#xff0c;在C#中要对Datatable排序&#xff0c;可使用DefaultView的Sort方法。先获取Datatable的DefaultView&#xff0c;然后设置 得到的Dataview的sort属性&#xff0c;最后用视图的ToTable方法将排好序的dataview导出为Datatable。 代码如下&#xff1a; …

for in for of区别_Python 第5课:for…in循环黄金搭档之列表

乐学趣学Py● 05&#xff1a;for…in循环黄金搭档之列表●Python趣味小百科Python程序中有一个有彩蛋&#xff0c;在IDLE Pythton模式下输入import this会出现一首(The Zen of Python, by Tim Peters)‘Pyton之禅’的小诗。这首小诗表明了用Python编写代码时遵循的原则&#xf…

Android官方开发文档Training系列课程中文版:Android的安全建议 .

转载:http://blog.csdn.net/sahadev_/article/details/52949855 原文地址:http://android.xsoftlab.net/training/articles/security-tips.html Android系统内置的安全策略可以有效的降低应用程序的安全问题。所以默认创建的应用程序已经包含了一定程度的安全保护措施。 Andr…

PHP提取字符串中的数字

function number($str) {return preg_replace(/\D/s, , $str); } // echo 123456 echo number(Hello 123 world 456 !!); //支持小数 function number($str) { return preg_replace(/[^\.0123456789]/s, , $str); } 转载于:https://www.cnblogs.com/shcolo/p/5945192.html

开源虎墩同名电影《小虎墩大英雄》定档大年初一

文末有福利&#xff0c;记得看到最后哦~| 作者&#xff1a;虎虎生风的开源虎墩组| 编辑&#xff1a;刘雪洁| 责编&#xff1a;王玥敏开源虎墩诞生记&#xff1a;小源机器人2.0大家还记得 2020 疫情肆虐的时候开源社与来自全国各地的开源爱好者隔空合作&#xff0c;共同打造的疫…

HYDRAstor:可扩展的二级存储

为什么80%的码农都做不了架构师&#xff1f;>>> 原文&#xff1a;HYDRAstor: a Scalable Secondary Storage. HYDRAstor&#xff08;官网&#xff09;是NEC推出的二级存储系统,先后有多篇关于HYDRAstor的论文发表在FAST&#xff08;包括后来9livesdata发表的论文&a…

测试环境搭建及维护

搭建良好的测试环境是执行测试用例的前提&#xff0c;也是完成测试任务顺利完成的保证。测试环境大体可分为硬件环境和软件环境&#xff0c;硬件环境包括测试必须的PC机&#xff0c;服务器&#xff0c;设备&#xff0c;网线&#xff0c;分配器等硬件设备&#xff1b;软件环境包…

汇编语言之寄存器(CPU工作原理)

1、介绍 一个典型的CPU&#xff0c;由运算器、控制器、寄存器等器件组成&#xff0c;对于游戏修改者来说&#xff0c;重点学习寄存器&#xff0c;其它不必管。 不同的CPU&#xff0c;寄存器的个数、结构是不相同的&#xff0c;8086CPU有14个寄存器&#xff0c;每个寄存器有一个…

如何通过 C# 动态备份 Sql 数据库?

咨询区 kaiz.net我想写段代码来备份我的 Sql Server 2008 数据库&#xff0c;请问大家有什么好的方法吗&#xff1f;回答区 Stacked你可以用代码去执行 BACKUP DATABASE ... TO DISK 命令&#xff0c;比如下面这样&#xff0c;先配置下config。<?xml version"1.0&quo…

学好英语网首页制作_没有美术基础的新手小白,如何学好淘宝美工?

没有美术基础的新手小白&#xff0c;如何学好淘宝美工&#xff1f;俗话说&#xff1a;万事开头难&#xff0c;没有任何基础、没有美术基础学淘宝美工&#xff0c;要怎么学习好呢&#xff1f;显然&#xff0c;作为一名没有美术基础的新手小白&#xff0c;一般开始学习的时候都是…