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

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

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

我可以看到有以下代码:

mRegionManager.Regions[RegionNames.MainRegionStatic].ActiveViews

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

【问题讨论】:

    标签: c# wpf mvvm prism


    【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 2010-12-04
        相关资源
        最近更新 更多