查看导航棱镜

时间:2011-05-07 22:20:42

标签: wpf view navigation prism

嘿伙计们,
我正在使用棱镜4来实现我的演示, 问题是我正在使用包含区域的视图,现在我想导航到同一范围内的其他视图实例,因此我将视图的KeepAlive属性设置为false,以便在导航中视图将从区域和新视图将出现,但我一直在获取区域名称已存在异常 如何在包含区域的同一视图的几个实例之间导航(当时只有一个应该在内存中)
由于
伊兰

1 个答案:

答案 0 :(得分:0)

听起来您想要使用带有导航的范围化RegionManager。您看到区域名称已存在异常的原因是因为您在同一RegionManager中有多个具有相同名称的区域。

默认情况下,PRISM不支持带有导航的作用域RegionManagers,但如果您使用自定义RegionBehaviors,则很容易添加它。基本上您需要做的是创建一个接口,然后在视图或视图模型上实现该接口。然后,创建一个查找该接口的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;
        }
相关问题