如何使用 PRISM 获取区域中的当前活动视图?

Posted

技术标签:

【中文标题】如何使用 PRISM 获取区域中的当前活动视图?【英文标题】:How to get the current active view in a region using PRISM? 【发布时间】:2011-09-15 13:48:27 【问题描述】:

我知道我可以通过以下方式获取一个区域中的所有注册视图:

var vs = mRegionManager.Regions[RegionNames.MainRegionStatic].Views.ToList();

我可以看到有以下代码:

mRegionManager.Regions[RegionNames.MainRegionStatic].ActiveViews

它提供了一个 Active View 列表,但我将我的区域附加到一个 ContentControl,它总是有一个 ActiveView。我误解了还是有办法获得单个活动视图?

【问题讨论】:

【参考方案1】:

var singleView = regionManager.Regions["MyRegion"].ActiveViews.FirstOrDefault();

【讨论】:

效果很好,但我们怎么有这样的收藏? 因为SingleActiveRegion继承了Region 有没有办法使用 IoC 容器(在我的情况下为 DryIoc)获取现有 VM?我从ShellViewModel 尝试了this == _Container.Resolve<ShellViewModel>,它评估为false【参考方案2】:
var singleView = regionManager.Regions["MyRegion"].ActiveViews.FirstOrDefault();

这是不正确的,因为它只会带来首先被激活的任何视图。不是当前活动/可见的视图。

虽然找不到直接的解决方案,但不涉及 View 或 ViewModel 上的自定义实现。

【讨论】:

有趣!! ,但当时这是我需要的。你能提供更多细节吗?【参考方案3】:

好吧,您可以使用 NavigationService Journal。它记录了您的应用程序中发生的所有导航。因此,您可以像这样获取视图的名称:

string name = mRegionManager.Regions[RegionNames.MainRegionStatic].NavigationService.Journal.CurrentEntry.Uri;

然后你可以得到这样的视图:

mRegionManager.Regions[RegionNames.MainRegionStatic].GetView(name);

甜蜜对吧? :)

【讨论】:

【参考方案4】:

使用 Xamarin.Forms 和 Prism,这对我来说效果很好。更改 regionName,将 View Model 基础更改为您的。

public VisualElement GetCurrentRegionView()

    var regionName = "MenuPageRegion";
    var region = RegionManager.Regions[regionName];
    var uri = region.NavigationService.Journal.CurrentEntry.Uri.OriginalString;
    foreach (var view in region.ActiveViews)
    
        var name = view.GetType().FullName;
        if (name.EndsWith(uri))
            return view;
    
    return null;


public CommonViewModelBase GetCurrentRegionViewModel()

    var view = GetCurrentRegionView();
    if (view != null)
    
        var binding = view.BindingContext;
        if (binding is CommonViewModelBase model)
            return model;
    
    return null;

【讨论】:

以上是关于如何使用 PRISM 获取区域中的当前活动视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Prism 中为我的对话窗口设置区域管理器?

如何在视图绑定中的活动中获取回收者视图当前项目文本值

当使用 RegionManager.RequestNavigate 方法添加视图时,有啥方法可以从 Prism 区域中删除视图(按名称)?

如何从应用程序委托中获取 iOS 应用程序中的活动视图?

如何在 Xamarin 表单中的视图模型之间最好地传递信息 - Prism [关闭]

多个区域内的 PRISM RegionManager 区域