Prism RequestNavigate应该在没有UI的情况下工作吗?

时间:2015-10-12 19:03:35

标签: wpf prism

我有一个支持Prism 4.0的WPF应用程序,它广泛使用RequestNavigate,并且运行良好。我有一个场景,我想将我的部分UI渲染到一个图像并存储它以供以后从Windows服务使用。我已经知道如何使用RenderTargetBitmap生成图像,但每当我的代码尝试调用RequestNavigate时,都没有任何反应。我正在调用引导程序,所以我希望所有类型都被加载,但它只是无法正常工作。任何人都可以告诉我,这是否应该可行? RequestNavigate有什么固有的东西阻止它在没有UI的情况下工作吗?

个别步骤: 首先,我在我的MefBootstrapper上调用Run。这会将所有程序集加载到AggregateCatalog中。

然后,我使用MEF CompositionContainer.GetExportedValue创建一个WPF UserControl,它具有一个分配了RegionManager.RegionName的ContentControl。这总是创建初始的UserControl。

最后,我使用UserControl上的区域名称和我希望它加载的另一个UserControl的路径调用MefRegionManager.RequestNavigate。这无法加载我尝试导航到的UserControl。

如果这些是我遵循的唯一步骤,那么最终的UserControl无法加载我是从Windows服务运行还是从我的WPF应用程序运行。但是,如果我在调用RequestNavigate之前调用SetRegionManager来明确地从我的主机UserControl添加区域,那么只要代码在WPF应用程序中运行,最后的UserControl就会正确加载。如果从我的Windows服务运行相同的代码,则它仍然无法加载。

1 个答案:

答案 0 :(得分:0)

RequestNavigate就是一个导航到加载(但不活动)区域的请求。它不会自己做任何装载。您需要单独管理视图的加载(包括视图中的视图)。

如果您的嵌套用户控件仅在父级中过载,并且您不需要在运行时对其进行管理,则可以使用 ViewDiscovery 。您可以提前注册所有视图,然后在创建区域时,它会查找(并加载)所有嵌套视图。如果您需要在运行时管理视图,切换它们等,那么您可以使用 ViewInjection

对于 ViewDiscovery ,在模块中 ModuleInit 类的 Initialize 方法中,插入以下行:

_regionManager.RegisterViewWithRegion("RegionNameOfYourNestedControl",
  () => this.container.Resolve<NestedUserControl>());

然后当您的区域加载时, NestedUserControl 将自动加载到您的ContentControl(区域)中。

有关ViewDiscovery,ViewInjection和UI组合的更多详细信息,have a read of the prism documentation