如何使用 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 获取区域中的当前活动视图?的主要内容,如果未能解决你的问题,请参考以下文章
当使用 RegionManager.RequestNavigate 方法添加视图时,有啥方法可以从 Prism 区域中删除视图(按名称)?