WPF Prism Framework Regionは機能しませんか?

WPF Prism Framework Regionは機能しませんか?

一般的なクライアントプロジェクトの通常の操作フローは、ポップアップログインウィンドウ=“アカウント検証成功=”ログインウィンドウを閉じる=“メインウィンドウをポップアップする=”メインウィンドウで作業する。

最后更新 2021/01/07 10:53
沙漠尽头的狼
预计阅读 3 分钟
分类
WPF
专题
WPF MVVMフレームワークPrismシリーズ
标签
.NET WPF Prism Region

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

問題の説明

一般的なクライアントプロジェクトの通常の操作フローは、ポップアップログインウィンドウ=“アカウント検証成功=”ログインウィンドウを閉じる=“メインウィンドウをポップアップする=”メインウィンドウで作業する。

一般的なログインプロセス

常规登录流程

上のGIFのように、左側にツリー、右側にTab Controlがあり、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多代码
}

実際の実行では、ナビゲーションが機能していないことがわかりました。元の操作はログインに成功し、新しいメインフォームがポップアップし、app.xaml.csに登録されたログインフォームビューです。

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

数百人がこの問題に直面しています:

  1. WPF Prismフレームワークでメインフォームを開く前にフォームにログインします(CSDNディスカッションポスト、元のリンクはメンテナンスされなくなりました)。

議論は燃えていて、望ましい結果が見えません。

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

この記事で与えられた答えは、ウェブマスターが使用していない手動再登録ゾーンマネージャです。

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

このコードは、ユーザーコントロールとしてログインとメインフォーム、app.xaml.cs登録shellview、領域設定shellview、ナビゲーションを介してこの領域を切り替える2つのユーザーコントロール、効果は問題ありません、メインフォーム内の領域は通常使用できますが、カスタムログインインターフェイスとメインインターフェイス、一般的なタイトルバーは何も異なり、このアプローチはより面倒で、使用は推奨されません。

看问题 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找到一个答案。

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网站留言。

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2023/06/11

7/7

NET Core3環境でMVVMフレームワークPrismのダイアログサービスを使用する方法は、prismシリーズの最後の記事です。

继续阅读
同分类 / 同标签 2023/06/11

6/7

NET Core3でMVVMフレームワークを使用する方法Prism地域ベースのナビゲーションシステム

继续阅读
同分类 / 同标签 2023/06/11

5/7

NET Core3環境でMVVMフレームワークを使用する方法Prismのゾーンマネージャを使用したビューの管理

继续阅读