WPF Prism框架Region失效了?
站长最近转载了痕迹的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>();
}
百度到也有人遇到这个问题:
讨论区很火,没看到想要的结果。
这篇给出的答案是手动再注册区域管理器,站长没有采用。
RegionManager.SetRegionName( theNameOfTheContentControlInsideThePopup, WellKnownRegionNames.DataFeedRegion );
RegionManager.SetRegionManager( theNameOfTheContentControlInsideThePopup, theRegionManagerInstanceFromUnity );
这个代码是将登录与主窗体做为用户控件,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
,shell
指CreateShell()
注册的主窗体),先弹出登录窗口,验证成功再初始化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失效了?的更多相关文章
- WPF Prism框架下基于MVVM模式的命令、绑定、事件
Prism框架下的自定义路由事件和命令绑定 BaseCode XAML代码: <Button x:Class="IM.UI.CommandEx.PrismCommandEx" ...
- Prism.WPF -- Prism框架使用(上)
本文参考Prism官方示例 创建Prism项目 将App.xaml中的WPF标准Application替换为PrismApplication,移除StartupUri属性: 将App.xaml.cs中 ...
- Prism.WPF -- Prism框架使用(下)
本文参考Prism官方示例 命令使用 Prism提供了两种命令:DelegateCommand和CompositeCommand. DelegateCommand DelegateCommand封装了 ...
- WPF Step By Step 系列-Prism框架在项目中使用
WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...
- .NET Core 3 WPF MVVM框架 Prism系列之命令
本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的命令的用法 一.创建DelegateCommand命令 我们在上一篇.NET Core 3 WPF MVVM框架 Prism系列之 ...
- .NET Core 3 WPF MVVM框架 Prism系列之事件聚合器
本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器 在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...
- .NET Core 3 WPF MVVM框架 Prism系列之对话框服务
本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的对话框服务,这也是prism系列的最后一篇完结文章,下面是Prism系列文章的索引: .NET Core 3 WPF MVVM框 ...
- .NET Core 3 WPF MVVM框架 Prism系列文章索引
.NET Core 3 WPF MVVM框架 Prism系列之数据绑定 .NET Core 3 WPF MVVM框架 Prism系列之命令 .NET Core 3 WPF MVVM框架 Prism系列 ...
- 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...
- WPF PRISM开发入门一( 初始化PRISM WPF程序)
这篇博客将介绍在WPF项目中引入PRISM框架进行开发的一些基础知识.目前最新的PRISM的版本是Prism 6.1.0,可以在Github上获取PRISM的源码.这个系列的博客将选择PRISM 4. ...
随机推荐
- PTA数组及排序查找题解与解题思路
PTA数组及排序查找题解与解题思路 函数题目 函数题目为平台提供的裁判程序调用所完成的函数进行判题,题目规定语言为C语言 6-1 求出二维数组的最大元素及其所在的坐标 本题较为简单,考察的是如何遍历一 ...
- 华企盾DSC导致wps个人模式无策略组新建的文件仍然加密
解决方法:右键wps安装目录手动解密即可(原因:wps模板被加密导致)
- 安装华企盾DSC防泄密系统huawei Intel的电脑,加载驱动失败
解决方法:从控制面板-[启用或关闭Windows功能]里面把[Hyper-V的功能]关闭 重启电脑再开启之后可以加密驱动则可以加载成功
- Python——第一章:数据类型介绍
数据类型: 区分不同的数据.不同的数据类型应该有不同的操作 数字: 做加减乘除+-*/ 整数,int 小数,float a= 10 #整数 b = 20 print(a + b) #加法运算 c = ...
- MySQL|MySQL事物以及隔离级别
MySQL 事务主要用于处理操作量大,复杂度高的数据.比如开单,需要添加给订单表增加记录,还需要增加订单的各种相关明细,操作复杂度高,这些操作语句需要构成一个事务.在 MySQL 命令行的默认设置下, ...
- Feign源码解析:初始化过程(三)
背景 前面两篇讲了下,在一个典型的引入了feign.loadbalancer.nacos等相关依赖的环境中,会有哪些bean需要创建. 其中第一篇讲了非自动配置的bean,第二篇是自动配置的bean. ...
- 2021-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?
2021-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据.数据库不能停,并且还有增删改操作.请问如何操作? 福哥答案2020-01-20: 陌陌答案: 用pt_o ...
- vscode搜索卡顿
解决vscode搜索,编辑器卡死问题
- 三大基础方案和AI出海计划重磅发布!加速盘古大模型生态发展
本文分享自华为云社区<三大基础方案和AI出海计划重磅发布!加速盘古大模型生态发展>,作者: 华为云头条. 近日,以"开放同飞,共赢行业AI新时代"为主题的华为云盘古大模 ...
- 云图说|什么是可信智能计算服务TICS
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 本文分享自华为云社区&l ...