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

本文关键字:活动 视图 何使用 PRISM 获取 区域 | 更新日期: 2023-09-27 17:59:08

我知道我可以用获得一个区域中所有注册的视图

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

我可以看到下面的代码:

mRegionManager.Regions[RegionNames.MainRegionStatic].ActiveViews

它给出了一个活动视图的列表,但我将我的区域附加到一个ContentControl,该ContentControl总是有一个ActiveView。我是被误解了,还是有办法获得单一的主动视图?

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

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

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

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

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

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

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

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

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

甜蜜对吗?:)

使用Xamarin.Forms&Prism,这对我来说很好。更改regionName,将视图模型基础更改为您的。

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;
}