Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Prism,如何将作用域RegionManager注入服务?_C#_Wpf_Prism_Tabcontrol_Region - Fatal编程技术网

C# 使用Prism,如何将作用域RegionManager注入服务?

C# 使用Prism,如何将作用域RegionManager注入服务?,c#,wpf,prism,tabcontrol,region,C#,Wpf,Prism,Tabcontrol,Region,我正在开发一个Prism应用程序,它包含一个TabControl,其中包含几个子区域。因此,根据Brian Lagunas在其PluralSight课程中描述的模式,我实现了一个自定义RegionBehavior,该课程在中找到并注入了一个自定义RegionNavigationContentLoader(也在前面的课程中描述),以确保我没有异常,并且可以在TabControl的几个选项卡上具有相同名称的区域 对于无法访问PluralSight的用户: 我实现了一个监视区域的视图集合的行为,当它发

我正在开发一个Prism应用程序,它包含一个
TabControl
,其中包含几个子区域。因此,根据Brian Lagunas在其PluralSight课程中描述的模式,我实现了一个自定义RegionBehavior,该课程在中找到并注入了一个自定义RegionNavigationContentLoader(也在前面的课程中描述),以确保我没有异常,并且可以在TabControl的几个选项卡上具有相同名称的区域

对于无法访问PluralSight的用户:

我实现了一个监视区域的视图集合的行为,当它发生更改时,检查添加的视图或其DataContext是否实现了特定接口。如果检测到此接口,它会将作用域RegionManager设置为该接口的属性,因此进入作用域的所有视图都可以知道其作用域RegionManager

但是,我也有一些服务需要此作用域RegionManager,以便导航到TabControl中的子区域

由于我在容器中创建此服务,它将注入全局RegionManager,而不是作用域管理器

我的问题是:

  • 是否存在允许将作用域区域管理器注入服务的模式或结构
  • 如果1的答案是否定的,服务是否应该导航到区域,或者这是一个坏主意
  • 更新

    下面是我的应用程序的计划结构。我希望它能清楚地说明我为什么要从服务中导航到一个作用域区域:

    如前所述,该应用程序由一个
    TabControl
    组成,其中每个TabItems都包含一个分析

    分析始终由选定的可视化组成,可在右上框中选择。当一个可视化被选中时,它会在一个服务中被激活,该服务主要调用代码来生成可视化,检查设置的有效性等

    然后,可视化应显示在可视化区域中,可视化特定设置应显示在设置区域中

    我的计划是从服务内部导航到这两个区域

    由于无法预先生成可视化(在显示之前必须始终执行一些检查),我无法直接从视图/视图模型导航。即使可能,显示所有可视化类型的视图也不知道作用域RegionManager,因为它是合成视图的一部分(父视图是知道的,当然可以将作用域RegionManager注入其子视图,但在我看来,这就像一种代码气味)


    这种类型的应用程序可能不适合Prisms导航方法,或者你知道我如何重新构造我的应用程序以更好地适应Prism吗?

    你将无法将作用域管理器插入到你的服务中。见鬼,你甚至无法将作用域管理器插入到Viewmodel中,这就是你需要的原因首先要获得它的自定义行为

  • 一个选项是向服务中添加RegionManager属性,并将该属性设置为VM中的作用域区域管理器实例
  • 我不确定是否会有任何服务导航到范围内的区域。这似乎让服务承担了太多的责任,这可能会导致不必要的复杂性。在这种情况下,我希望服务返回一个结果,我的虚拟机可以响应该结果,以便导航到它需要的位置。这取决于服务需要导航的原因你可以采取另一种方法来完成同样的事情
  • 更新:
    我将使可视化类型成为主选项卡视图的一部分。我看不出有任何理由将其作为一个单独的区域。这将允许您访问范围区域管理器,您现在可以将视图导航到VisualizationRegion。服务应该不了解区域管理器。只需响应可视化区域管理器即可类型选择发生变化,调用所需的服务,获得结果,并进行相应的导航。

    如果您确实需要在ScopedRegionManager上执行逻辑,除了Brians回答之外,我建议您使用两种方法

  • 让您的服务不知道您的RegionManager或导航逻辑。您还可以在服务完成其逻辑时返回要执行的操作或Func
  • 当没有需要替换的逻辑(更改实例注册)时,您还可以将逻辑放入RegionManager的扩展方法中:
  • _


    谢谢你的回复。我已经怀疑我不能将SRM注入到我的服务中,但我希望像IRegionAware这样的模式能够实现这一点。我扩展了我的问题,以使我的要求(希望)更清楚一点。也许你有什么想法?
       public static IRegionManager NavigateView(this IRegionManager regionManager, string regionName, string view, NavigationParameters parameters = null)
       {
           var navigationUri = new Uri(view, UriKind.Relative);
           regionManager.RequestNavigate(regionName, navigationUri, parameters);
           return regionManager;
        }