听起来您想使用带导航的范围区域管理器。您看到区域名称已存在异常的原因是您在同一个 RegionManager 中有多个同名区域。
默认情况下,PRISM 不支持带导航的作用域区域管理器,但如果您使用自定义区域行为,则很容易添加它。本质上,您需要做的是创建一个接口,然后在您的视图或视图模型上实现该接口。然后,创建一个查找该接口的 RegionBehavior,如果满足要求,则为该视图创建一个新的 RegionManager 实例。
界面可能如下所示:
public interface IRegionScopeAware
{
bool IsRegionManagerScoped { get; }
}
这就是 RegionBehavior 的样子:
public class RegionScopeAwareBehavior : RegionBehavior
{
#region Overrides of RegionBehavior
protected override void OnAttach()
{
Region.Views.CollectionChanged += ViewsOnCollectionChanged;
ApplyScopedRegionManager(Region.Views.OfType<FrameworkElement>());
}
#endregion
private static void ViewsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems == null || e.Action != NotifyCollectionChangedAction.Add) return;
ApplyScopedRegionManager(e.NewItems.OfType<DependencyObject>());
}
private static void ApplyScopedRegionManager(IEnumerable<DependencyObject> views)
{
if (views == null) return;
foreach (var view in views)
{
ApplyScopedRegionManager(view);
}
}
private static void ApplyScopedRegionManager(DependencyObject view)
{
if (view == null) return;
IRegionScopeAware scopeAware = view as IRegionScopeAware;
if (scopeAware == null && view is FrameworkElement)
scopeAware = ((FrameworkElement) view).DataContext as IRegionScopeAware;
if (scopeAware != null)
ApplyScopedRegionManager(scopeAware, view);
}
private static void ApplyScopedRegionManager(IRegionScopeAware scopeAware, DependencyObject view)
{
if (view == null) return;
if (scopeAware == null) return;
if (scopeAware.IsRegionManagerScoped)
RegionManager.SetRegionManager(view, new RegionManager());
}
}
别忘了您需要注册您的 RegionBehavior。我建议将其注册为引导程序中的默认 RegionBehavior,如下所示:
protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
IRegionBehaviorFactory factory = base.ConfigureDefaultRegionBehaviors();
factory.AddIfMissing(typeof(RegionScopeAwareBehavior).Name, typeof(RegionScopeAwareBehavior));
return factory;
}