redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

Prismを使用してサブウィンドウでRegionを使用した場合に発生したエラーと対処方法・その2

一つ前の記事で、サブウィンドウでもMainWindow(親ウィンドウ)と同一のRegionManagerを使用するように設定した。そうしたら、新たな問題が発生した。

サブウィンドウを閉じて、また開くとエラーが発生する

サブウィンドウでもMainWindow(親ウィンドウ)と同一のRegionManagerを使用するようにした状態で、サブウィンドウを一度閉じて、再び親ウィンドウからサブウィンドウを開くと例外が発生した。

例外ログ

Prism.Regions.Behaviors.RegionCreationException: An exception occurred while creating a region with name 'ContentRegion'. The exception was: System.ArgumentException: Region with the given name is already registered: ContentRegion
   at Prism.Regions.RegionManager.RegionCollection.Add(IRegion region)
   at Prism.Regions.Behaviors.RegionManagerRegistrationBehavior.TryRegisterRegion()
   at Prism.Regions.Behaviors.RegionManagerRegistrationBehavior.StartMonitoringRegionManager()
   at Prism.Regions.Behaviors.RegionManagerRegistrationBehavior.OnAttach()
   at Prism.Regions.RegionBehavior.Attach()
   at Prism.Regions.RegionBehaviorCollection.Add(String key, IRegionBehavior regionBehavior)
   at Prism.Regions.RegionAdapterBase`1.AttachDefaultBehaviors(IRegion region, T regionTarget)
   at Prism.Regions.RegionAdapterBase`1.Initialize(T regionTarget, String regionName)
   at Prism.Regions.RegionAdapterBase`1.Prism.Regions.IRegionAdapter.Initialize(Object regionTarget, String regionName)
   at Prism.Regions.Behaviors.DelayedRegionCreationBehavior.CreateRegion(DependencyObject targetElement, String regionName).

どうやら、サブウィンドウのRegionを2重に設定しようとして発生しているようだ。

それならば、サブウィンドウのClosingイベントで何らかの処理をすれば良さそうだ。

試しに、Regionに設定しているViewを削除する処理を入れてみたが、エラーは変わらず。

次に、RegionManagerに登録されているRegion自体を削除する処理を入れたところ、サブウィンドウを閉じたり開いたりしても例外が発生しなくなった。

public IRegionManager MainRegionManager { get; }

public DelegateCommand ClosingCommand { get; set; }

public SubWindowViewModel(IRegionManager regionManager)
{
    MainRegionManager = regionManager;

    ClosingCommand = new DelegateCommand(ExecuteClosing);
}

private void ExecuteClosing()
{
    MainRegionManager.Regions.Remove("ContentRegion");
}

動作環境

  • .NET Core 3.1
  • Prism 7.2

以上