【问题标题】:views navigation prism查看导航棱镜
【发布时间】:2023-03-14 13:22:01
【问题描述】:

大家好,
我正在使用 prism 4 来实现我的演示文稿, 问题是我正在使用包含区域的视图,现在我想导航到同一范围内的其他视图实例,因此我将视图的 KeepAlive 属性设置为 false,以便在导航中视图将从区域和新视图将出现,但我不断收到区域名称已存在异常。
如何在包含区域的同一视图的几个实例之间导航(当时只有一个应该在内存中)
谢谢
伊兰

【问题讨论】:

  • 这里有同样的问题。导航示例似乎没有看到这一点。

标签: wpf view navigation prism


【解决方案1】:

听起来您想使用带导航的范围区域管理器。您看到区域名称已存在异常的原因是您在同一个 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;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多