站长最近转载了痕迹的Prism 8系列博文,不知道你对该框架是否有一定了解了?不了解,可以看看本号转载的系列:

以及最近本号介绍的一款使用Prism开发的开源项目:Prism for WPF 搭建一个简单的模块化开发框架

站长15年开始使用Prism 4,去年(2020年)也使用Prism 8做开源项目,今天分享处理Prism Region的一个问题。

问题描述

一般客户端项目常规操作流程是:弹出登录窗口=》账号验证成功=》关闭登录窗口=》弹出主窗口=》在主窗口作业。

像上面的gif图主窗体,左侧是一棵树,右侧是TabControl,使用Prism模块中注入视图代码:

public class ModuleOfLogModule : IModule
{ public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<MainTabItemView, MainTabItemViewModel>(KEY_OF_CURRENT_MODULE);
}
}

主工程TabControl为模块视图显示区域:

<TabControl prism:RegionManager.RegionName="{x:Static inf:RegionNames.MainTabRegion}" />

点击左侧菜单树时,动态导航模块视图:

private void RaiseSelectedItemHandler(CustomMenuItem menuItem)
{
// 此处省略N多代码
region.RequestNavigate(menuItem.Key);
// 此处省略N多代码
}

实际运行时发现导航没有起作用,原来的操作是登录成功,直接New的主窗体弹出,app.xaml.cs中注册的登录窗体视图:

protected override Window CreateShell()
{
return Container.Resolve<LoginView>();
}

百度到也有人遇到这个问题:

  1. WPF Prism框架下先登录窗体再打开主窗体

讨论区很火,没看到想要的结果。

  1. prism – 区域管理器无法在自定义弹出窗口中找到区域

这篇给出的答案是手动再注册区域管理器,站长没有采用。

RegionManager.SetRegionName( theNameOfTheContentControlInsideThePopup, WellKnownRegionNames.DataFeedRegion );
RegionManager.SetRegionManager( theNameOfTheContentControlInsideThePopup, theRegionManagerInstanceFromUnity );
  1. Prism MVVM应用 登陆后切换主窗体实现

这个代码是将登录与主窗体做为用户控件,app.xaml.cs中注册shellview,shellview中设置一个区域,两个用户控件通过导航在这个区域切换,效果是没问题,主窗体内的区域能正常使用,但自定义的登录界面和主界面,一般标题栏啥的都不一样,这种做法比较麻烦,不推荐使用。

看问题3类似的描述:Prism MVVM应用 登陆后切换主窗体实现

应用场景
使用Prism7开发WPF程序,编码采用MVVM形式。当程序启动时,首先进入一个登陆界面,进行登陆认证,认证成功后转入程序布局主窗口。 设计思路
WPF程序框架搭建后,程序中存一个Shell.xaml,相当于表演者的唯一舞台。登陆窗体(以下简称 LoginView)和程序布局主窗体(以下简称 MainView),分别利用IRegionManager进行管理,根据需要在不同时机相继出场表演。所有操作均由各自ViewModel(简称VM)代码完成。
1.当程序启动后,Shell通过VM,使用RegionManager的Add方法激活LoginView,(注:站长补充描述=登录验证成功,注销LoginView,再通过Add方法激活MainView)

站长采用的解决方案

baidu基本上没有找到比较合适的方案了,这个问题纠结了我几天(每天晚上搞2、3个小时,站长平时工作已经不做WPF了)。

还好我有上网的方法,在YouTube上Adding a Prism Login Screen找到一个答案。

解决方案的代码很简单,在app.xaml.cs中添加如下代码,在初始化shell之前(InitializeShell,shellCreateShell()注册的主窗体),先弹出登录窗口,验证成功再初始化shell(base.InitializeShell(shell)):

protected override void InitializeShell(Window shell)
{
LoginView loginView = new LoginView();
if (loginView.ShowDialog() == true)
{
var shellVM = shell.DataContext as MainWindowViewModel;
shellVM.InitData();
base.InitializeShell(shell);
}
else
{
Application.Current.Shutdown(-1);
}
}

文末探讨

其实该解决方案还是有问题的,在调用InitializeShell(Window shell)之前,站长调试发现模块视图已经执行了初始化,按道理说应该是登录成功后模块才执行初始化的,更多思考留给你,有什么建议欢迎Dotnet9网站留言。


文末分享

  • 后台回复数字【00】:获取DotNet、Java、C++、前端等技术资料
  • 添加微信群:添加号主微信号【dotnet9】,备注【入群】
  • 添加QQ群:【771992300】,备注【Dotnet9】

时间如流水,只能流去不流回。

  • 公众号:Dotnet9
  • 号主微信号:dotnet9
  • 文章示例代码仓库地址:lqclass.com
  • 作者及编辑:沙漠之尽头的狼
  • 原文链接:原文
  • 日期:2021-01-07

WPF Prism框架Region失效了?的更多相关文章

  1. WPF Prism框架下基于MVVM模式的命令、绑定、事件

    Prism框架下的自定义路由事件和命令绑定 BaseCode XAML代码: <Button x:Class="IM.UI.CommandEx.PrismCommandEx" ...

  2. Prism.WPF -- Prism框架使用(上)

    本文参考Prism官方示例 创建Prism项目 将App.xaml中的WPF标准Application替换为PrismApplication,移除StartupUri属性: 将App.xaml.cs中 ...

  3. Prism.WPF -- Prism框架使用(下)

    本文参考Prism官方示例 命令使用 Prism提供了两种命令:DelegateCommand和CompositeCommand. DelegateCommand DelegateCommand封装了 ...

  4. WPF Step By Step 系列-Prism框架在项目中使用

    WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...

  5. .NET Core 3 WPF MVVM框架 Prism系列之命令

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的命令的用法 一.创建DelegateCommand命令 我们在上一篇.NET Core 3 WPF MVVM框架 Prism系列之 ...

  6. .NET Core 3 WPF MVVM框架 Prism系列之事件聚合器

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器  在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...

  7. .NET Core 3 WPF MVVM框架 Prism系列之对话框服务

     本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的对话框服务,这也是prism系列的最后一篇完结文章,下面是Prism系列文章的索引: .NET Core 3 WPF MVVM框 ...

  8. .NET Core 3 WPF MVVM框架 Prism系列文章索引

    .NET Core 3 WPF MVVM框架 Prism系列之数据绑定 .NET Core 3 WPF MVVM框架 Prism系列之命令 .NET Core 3 WPF MVVM框架 Prism系列 ...

  9. 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

    前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...

  10. WPF PRISM开发入门一( 初始化PRISM WPF程序)

    这篇博客将介绍在WPF项目中引入PRISM框架进行开发的一些基础知识.目前最新的PRISM的版本是Prism 6.1.0,可以在Github上获取PRISM的源码.这个系列的博客将选择PRISM 4. ...

随机推荐

  1. 用JS实现简单的屏幕录像机

    本文将介绍如何用JS实现简单的屏幕录像机. 一.录制准备 创建一个按钮 <button id="recording-toggle">Start recording< ...

  2. 安装华企盾DSC防泄密软件:编辑文件不加密常见问题,运维工程师必看

    1.先查看客户端日志主进程是否是加密进程.日志中是不是勾选智能半透明.加密类型是否有添加 2.用procmon监控保存的文件找出writefile的进程是否有添加,进程树是否有父进程,加密类型是否正确 ...

  3. 平衡树——AVL算法

    平衡树--AVL算法 平衡树建立在二叉搜索树的基础上,加入了两侧子树大小相对平衡的特性而避免了很多情况下的算法退化.这里AVL算法实现的AVL树就是平衡树的一种. 1.二叉搜索树 在说平衡树之前我们得 ...

  4. 聚焦企业开放OpenAPI痛难点,华为云API Explorer助力构建API门户

    本文分享自华为云社区<聚焦企业开放OpenAPI痛难点,华为云API Explorer助力伙伴构建API门户>,作者:华为云PaaS服务小智. 当前,IT研发的主流架构已从单体架构向微服务 ...

  5. Python中Round函数:怎么解释?怎么用?

    摘要:在本文中,介绍了什么是round函数以及如何从python内核中实现它.同时,还介绍舍入函数的一些缺点,以及如何纠正它们,如何在数据科学中广泛使用的库中发挥作用. Python中的舍入函数,返回 ...

  6. OLAP分析型应用场景中,数仓中vacuum为何对列存表无效

    摘要:对列存表执行vacuum为什么是无效的呢?其实这与列存表的存储结构以及数据写入方式有关. 本文分享自华为云社区<GaussDB(DWS)中vacuum为何对列存表无效?[这次高斯不是数学家 ...

  7. 一文搞定Matplotlib 各个示例丨建议收藏

    摘要:Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用 ,Matplotlib也是深度学习的常用绘图库,主要是将训练的成果进行图形化,因为这样更直观,更方便发现训练中的 ...

  8. 带你了解Node.js包管理工具:包与NPM

    摘要:包与NPM Node组织了自身的核心模块,也使得第三方文件模块可以有序的编写和使用. 本文分享自华为云社区<NodeJs深入浅出之旅:包与NPM>,作者:空城机. 包与NPM Nod ...

  9. 火山引擎DataTester:无需研发人力,即刻开启企业A/B实验

    近日,火山引擎A/B测试平台-- DataTester 对产品内A/B实验的"可视化编辑器"进行了新的升级,对交互.预览.Xpath的层次结构视图等能力均做了优化.   据介绍,火 ...

  10. JAVA性能优化- IntelliJ插件:java内存分析工具(JProfiler)

    JProfiler(Java性能分析神器) v11.1.4 下载 安装目录不要有空格 安装成功后,在 Intellij 里面选择对应的 jprofiler.exe 路径 点击下图JProfiler图标 ...