我有一个支持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服务运行相同的代码,则它仍然无法加载。
答案 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