WPF Prism框架Region失效了?

站長最近轉(zhuǎn)載了痕跡的Prism 8系列博文,不知道你對(duì)該框架是否有一定了解了?不了解,可以看看本號(hào)轉(zhuǎn)載的系列:

WPF Prism框架合集(2.創(chuàng)建Prism應(yīng)用程序)

WPF Prism框架合集(3.Region)

WPF Prism框架合集(Module)

WPF Prism框架合集(5.視圖注入)

以及最近本號(hào)介紹的一款使用Prism開發(fā)的開源項(xiàng)目:Prism for WPF 搭建一個(gè)簡單的模塊化開發(fā)框架

基于Prism的WPF大屏項(xiàng)目

站長15年開始使用Prism 4,去年(2020年??)也使用Prism 8做開源項(xiàng)目,今天分享處理Prism Region的一個(gè)問題。

問題描述

一般客戶端項(xiàng)目常規(guī)操作流程是:彈出登錄窗口=》賬號(hào)驗(yàn)證成功=》關(guān)閉登錄窗口=》彈出主窗口=》在主窗口作業(yè)。

常規(guī)登錄流程

像上面的gif圖主窗體,左側(cè)是一棵樹,右側(cè)是TabControl,使用Prism模塊中注入視圖代碼:

publicclassModuleOfLogModule:IModule

{

publicvoidRegisterTypes(IContainerRegistry?containerRegistry)

{

containerRegistry.RegisterForNavigation(KEY_OF_CURRENT_MODULE);

}

}

主工程TabControl為模塊視圖顯示區(qū)域:

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

點(diǎn)擊左側(cè)菜單樹時(shí),動(dòng)態(tài)導(dǎo)航模塊視圖:

privatevoidRaiseSelectedItemHandler(CustomMenuItem?menuItem)

{

//?此處省略N多代碼

region.RequestNavigate(menuItem.Key);

//?此處省略N多代碼

}

實(shí)際運(yùn)行時(shí)發(fā)現(xiàn)導(dǎo)航?jīng)]有起作用,原來的操作是登錄成功,直接New的主窗體彈出,app.xaml.cs中注冊(cè)的登錄窗體視圖:

protectedoverrideWindowCreateShell()

{

returnContainer.Resolve();

}

百度到也有人遇到這個(gè)問題:

WPF Prism框架下先登錄窗體再打開主窗體

討論區(qū)很火,沒看到想要的結(jié)果。

prism – 區(qū)域管理器無法在自定義彈出窗口中找到區(qū)域

這篇給出的答案是手動(dòng)再注冊(cè)區(qū)域管理器,站長沒有采用。

RegionManager.SetRegionName(?theNameOfTheContentControlInsideThePopup,?WellKnownRegionNames.DataFeedRegion?);

RegionManager.SetRegionManager(?theNameOfTheContentControlInsideThePopup,?theRegionManagerInstanceFromUnity?);

Prism MVVM應(yīng)用 登陸后切換主窗體實(shí)現(xiàn)

這個(gè)代碼是將登錄與主窗體做為用戶控件,app.xaml.cs中注冊(cè)shellview,shellview中設(shè)置一個(gè)區(qū)域,兩個(gè)用戶控件通過導(dǎo)航在這個(gè)區(qū)域切換,效果是沒問題,主窗體內(nèi)的區(qū)域能正常使用,但自定義的登錄界面和主界面,一般標(biāo)題欄啥的都不一樣,這種做法比較麻煩,不推薦使用。

看問題3類似的描述:Prism MVVM應(yīng)用 登陸后切換主窗體實(shí)現(xiàn)

應(yīng)用場景

使用Prism7開發(fā)WPF程序,編碼采用MVVM形式。當(dāng)程序啟動(dòng)時(shí),首先進(jìn)入一個(gè)登陸界面,進(jìn)行登陸認(rèn)證,認(rèn)證成功后轉(zhuǎn)入程序布局主窗口。

設(shè)計(jì)思路

WPF程序框架搭建后,程序中存一個(gè)Shell.xaml,相當(dāng)于表演者的唯一舞臺(tái)。登陸窗體(以下簡稱?LoginView)和程序布局主窗體(以下簡稱?MainView),分別利用IRegionManager進(jìn)行管理,根據(jù)需要在不同時(shí)機(jī)相繼出場表演。所有操作均由各自ViewModel(簡稱VM)代碼完成。

1.當(dāng)程序啟動(dòng)后,Shell通過VM,使用RegionManager的Add方法激活LoginView,(注:站長補(bǔ)充描述=登錄驗(yàn)證成功,注銷LoginView,再通過Add方法激活MainView)

站長采用的解決方案

baidu基本上沒有找到比較合適的方案了,這個(gè)問題糾結(jié)了我?guī)滋欤刻焱砩细?、3個(gè)小時(shí),站長平時(shí)工作已經(jīng)不做WPF了)。

還好我有科學(xué)上網(wǎng)的方法,在YouTube上Adding a Prism Login Screen找到一個(gè)答案。

Adding a Prism Login Screen

解決方案的代碼很簡單,在app.xaml.cs中添加如下代碼,在初始化shell之前(InitializeShell,shell指CreateShell()注冊(cè)的主窗體),先彈出登錄窗口,驗(yàn)證成功再初始化shell(base.InitializeShell(shell)):

protectedoverridevoidInitializeShell(Window?shell)

{

LoginView?loginView?=newLoginView();

if(loginView.ShowDialog()?==true)

{

varshellVM?=?shell.DataContextasMainWindowViewModel;

shellVM.InitData();

base.InitializeShell(shell);

}

else

{

Application.Current.Shutdown(-1);

}

}

文末探討

其實(shí)該解決方案還是有問題的,在調(diào)用InitializeShell(Window shell)之前,站長調(diào)試發(fā)現(xiàn)模塊視圖已經(jīng)執(zhí)行了初始化,按道理說應(yīng)該是登錄成功后模塊才執(zhí)行初始化的,更多思考留給你,有什么建議歡迎Dotnet9網(wǎng)站留言。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • C#/.Net Core/WPF框架初建(國際化、主題色) English | 簡體中文 作為 TerminalM...
    沙漠盡頭的狼閱讀 812評(píng)論 0 1
  • 最近公司讓我給其他員工普及一下Prism框架,整理一下資料和思路。于是乎翻譯了一下官方的介紹。 Prism簡介 1...
    勿念情閱讀 15,551評(píng)論 0 11
  • Prism 框架應(yīng)用-基礎(chǔ)知識(shí)篇 Prism 框架概念 prism was the code name for t...
    于躍_198e閱讀 793評(píng)論 0 1
  • 本文假設(shè)你已經(jīng)知道MVVM設(shè)計(jì)模式是什么,所以直接進(jìn)入正題,今天我們就用Prism來實(shí)現(xiàn)WPF的MVVM設(shè)計(jì)模式,...
    vaemc閱讀 26,536評(píng)論 1 17
  • 久違的晴天,家長會(huì)。 家長大會(huì)開好到教室時(shí),離放學(xué)已經(jīng)沒多少時(shí)間了。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,826評(píng)論 16 22

友情鏈接更多精彩內(nèi)容