1.在弹窗中,导航管理器中的导航区中找不到对应的导航区名称:(弹窗手动添加导航区的问题)
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="FirstViewA" />
public ViewAViewModel(IRegionManager regionManager, IContainerProvider containerProvider)
{
//DialogRegionManager = regionManager;// containerProvider.Resolve<IRegionManager>();
_regionManager = regionManager;
NavigationCommand = new DelegateCommand(NavigationExecute);
Message = "View A from your Prism Module";
}
private void NavigationExecute()
{
_regionManager.Regions["FirstViewA"].RequestNavigate(nameof(NavigationAView));//这里会报错
}
报错意思是该导航区管理员不包含该导航区。由于是新的弹窗,在新的弹窗界面添加的导航区无法加入到主界面的RegionManager中,也就是说在新弹窗时候,要手动将弹窗中的导航区添加到主界面的RegionManager中。方式如下:(绑定添加)
<ContentControl
Grid.Row="1"
prism:RegionManager.RegionManager="{Binding DialogRegionManager}" //在ViewModel中获取到主界面的RegionManager绑定,即可添加导航区到RegionManager
prism:RegionManager.RegionName="FirstViewA" />
ViewModel中获取主界面的RegionManager:
private IRegionManager _regionManager;
public IRegionManager DialogRegionManager
{
get { return _regionManager; }
set { SetProperty(ref _regionManager, value); }
}
public ViewAViewModel(IRegionManager regionManager, IContainerProvider containerProvider)
{
DialogRegionManager = regionManager;// containerProvider.Resolve<IRegionManager>();
_regionManager = regionManager;
NavigationCommand = new DelegateCommand(NavigationExecute);
}
有手动添加,就有手动移除
2.当弹窗关闭后,再次打开,会报错:(弹窗手动移除导航区)
报错意思就是该RegionManager的Region中早就有了FirstViewA导航区,也就是说在打开弹窗的时候,要手动添加导航区,关闭弹窗时要手动移除导航区:(包括导航区页面里的所有子导航区,存在的全部移除)
public void OnDialogClosed()
{
DialogRegionManager.Regions.Remove("FirstViewA");
DialogRegionManager.Regions.Remove("SonRegionView");//子导航页面的导航区
}
类似问题:
3.当导航页面中包含子导航区域,在其ViewModel的[RegionMemberLifetime(KeepAlive = false)]时,该导航页的View和ViewModel会被销毁,并重建。但在销毁View和ViewModel对象的同时,并没有从导航管理器中移除子导航区域,所以会报导航区域已注册的错误。这时需要手动将导航区域移除:
//从这个界面切换到其他导航页面时,将该界面的导航区移除
public void OnNavigatedFrom(NavigationContext navigationContext)
{
DialogRegionManager.Regions.Remove("SonRegionView");//切换时手动移除子导航区
}
4.Prism导航中,想要每次切换导航,View和ViewModel都是同一个实例:
在ViewModel中:
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
返回值设置为true即可,因为RegionMemberLifetime的KeepAlive默认是true。如果想要每次切换新生成对象,那么ViewModel添加[RegionMemberLifetime(KeepAlive = false)],