站長最近轉(zhuǎn)載了痕跡的Prism 8系列博文,不知道你對該框架是否有一定了解了隆判?不了解,可以看看本號轉(zhuǎn)載的系列:
WPF Prism框架合集(2.創(chuàng)建Prism應用程序)
以及最近本號介紹的一款使用Prism開發(fā)的開源項目:Prism for WPF 搭建一個簡單的模塊化開發(fā)框架
基于Prism的WPF大屏項目
站長15年開始使用Prism 4僧界,去年(2020年??)也使用Prism 8做開源項目侨嘀,今天分享處理Prism Region的一個問題。
問題描述
一般客戶端項目常規(guī)操作流程是:彈出登錄窗口=》賬號驗證成功=》關閉登錄窗口=》彈出主窗口=》在主窗口作業(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}" />
點擊左側(cè)菜單樹時涨共,動態(tài)導航模塊視圖:
privatevoidRaiseSelectedItemHandler(CustomMenuItem?menuItem)
{
//?此處省略N多代碼
region.RequestNavigate(menuItem.Key);
//?此處省略N多代碼
}
實際運行時發(fā)現(xiàn)導航?jīng)]有起作用,原來的操作是登錄成功宠漩,直接New的主窗體彈出举反,app.xaml.cs中注冊的登錄窗體視圖:
protectedoverrideWindowCreateShell()
{
returnContainer.Resolve();
}
百度到也有人遇到這個問題:
討論區(qū)很火哄孤,沒看到想要的結(jié)果瘦陈。
prism – 區(qū)域管理器無法在自定義彈出窗口中找到區(qū)域
這篇給出的答案是手動再注冊區(qū)域管理器,站長沒有采用蛾默。
RegionManager.SetRegionName(?theNameOfTheContentControlInsideThePopup,?WellKnownRegionNames.DataFeedRegion?);
RegionManager.SetRegionManager(?theNameOfTheContentControlInsideThePopup,?theRegionManagerInstanceFromUnity?);
這個代碼是將登錄與主窗體做為用戶控件捉貌,app.xaml.cs中注冊shellview,shellview中設置一個區(qū)域牧挣,兩個用戶控件通過導航在這個區(qū)域切換,效果是沒問題裆针,主窗體內(nèi)的區(qū)域能正常使用世吨,但自定義的登錄界面和主界面呻征,一般標題欄啥的都不一樣陆赋,這種做法比較麻煩,不推薦使用攒岛。
看問題3類似的描述:Prism MVVM應用 登陸后切換主窗體實現(xiàn)
應用場景
使用Prism7開發(fā)WPF程序阵子,編碼采用MVVM形式挠进。當程序啟動時誊册,首先進入一個登陸界面案怯,進行登陸認證,認證成功后轉(zhuǎn)入程序布局主窗口金砍。
設計思路
WPF程序框架搭建后麦锯,程序中存一個Shell.xaml,相當于表演者的唯一舞臺鹅巍。登陸窗體(以下簡稱?LoginView)和程序布局主窗體(以下簡稱?MainView),分別利用IRegionManager進行管理骆捧,根據(jù)需要在不同時機相繼出場表演。所有操作均由各自ViewModel(簡稱VM)代碼完成妆绞。
1.當程序啟動后接谨,Shell通過VM脓豪,使用RegionManager的Add方法激活LoginView,(注:站長補充描述=登錄驗證成功楞泼,注銷LoginView笤闯,再通過Add方法激活MainView)
站長采用的解決方案
baidu基本上沒有找到比較合適的方案了颗味,這個問題糾結(jié)了我?guī)滋欤刻焱砩细?浦马、3個小時,站長平時工作已經(jīng)不做WPF了)谨娜。
還好我有科學上網(wǎng)的方法趴梢,在YouTube上Adding a Prism Login Screen找到一個答案。
Adding a Prism Login Screen
解決方案的代碼很簡單坞靶,在app.xaml.cs中添加如下代碼滩愁,在初始化shell之前(InitializeShell,shell指CreateShell()注冊的主窗體)辫封,先彈出登錄窗口廉丽,驗證成功再初始化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);
}
}
文末探討
其實該解決方案還是有問題的,在調(diào)用InitializeShell(Window shell)之前责球,站長調(diào)試發(fā)現(xiàn)模塊視圖已經(jīng)執(zhí)行了初始化,按道理說應該是登錄成功后模塊才執(zhí)行初始化的嘉裤,更多思考留給你屑宠,有什么建議歡迎Dotnet9網(wǎng)站留言典奉。