我对如何做到这一点很迷茫。
我了解 MEF,并且可以使用在许多博客文章中发现的无处不在的 DeploymentCatalogService 从另一个 XAP 加载服务和类。我不明白的是如何从另一个 XAP 实际加载和导航到 PAGE。
我想要做的是让我的主应用程序能够调用 NavigationService 并为其提供应该存在的页面名称。喜欢:
NavigationService.Navigate(new Uri("/Test", UriKind.Relative));
将此页面提供给应用程序取决于其他 XAP 文件之一。但是,我不知道如何进行这项工作。似乎每个人都在构建一些复杂的基础设施来处理这种情况,这非常烦人且过于复杂。
有没有简单的方法来做到这一点?
最佳答案
我见过的一些例子比他们需要的更复杂,但这不是一项简单的任务。在我真正理解发生了什么之前,我花了 2 天的时间来分解我能找到的例子。
为此,您至少需要创建两个类。 一个实现 INavigationContentLoader 的类,这将完成所有工作。 实现 IAsyncResult 的类。该对象将在 INavigationContentLoader 周围传递,因此请使用它来跟踪您正在做的事情。
您的 INavgiationContentLoader 应该执行以下操作。
开始加载
- 测试Uri 属于当前XAP 还是已经加载的XAP。
- 如果没有,请使用 DeploymentCatalog 下载 XAP。将 DeploymentCatalog 存储在 AggregateCatalog 中。
- 使用 ExportFactory 为给定的 Uri 创建页面。在 IAsyncResult 上给自己一个属性来保存它。
- 如果操作没有被取消,则执行回调参数。
可以加载
您可以尝试在此处放置一些逻辑来测试您是否可以访问指定的 XAP,或者您可以返回 true 并完成它。
取消加载
在 IAsyncResult 中设置一个状态,让您知道操作已被取消。
结束加载
- 获取存储在 IAsyncResult 中的页面,将其包装在 LoadResult 中并返回。
将由此 INavgiationContentLoader 加载的所有页面都需要用 ExportAttribute 标记,以便 ExportFactory 可以找到它们。
编辑
我的 INavigationContentLoader
我的 IAsyncResult
要在页面上使用的 ExportAttribute。您需要在所有 页面上使用它,甚至是本地 XAP 中的页面。
IExportPageMetaData。这是 MEF 使用的契约(Contract)。
使用方法:
声明你的导航:像这样的框架
<navigation:Frame x:Name="ContentFrame"
Source="/Home"`
Grid.Column="1">
<navigation:Frame.ContentLoader>
<navUtil:DynamicContentLoader />
</navigation:Frame.ContentLoader>
</navigation:Frame>
HyperlinkButton 到另一个 XAP 的页面。
<HyperlinkButton Content="Page from another XAP"
NavigateUri="/NavigateUriFromExportPageAttribute"
navUtil:DynamicContentLoader.Xap="UriToOtherXap" />
从这个 XAP 到一个页面的超链接按钮。
<HyperlinkButton Content="Page from this XAP"
NavigateUri="/NavigateUriFromExportPageAttribute" />
您不需要 UriMapper,也不需要放置 Page.xaml 的路径。 MEF 将从页面读取 ExportPageAttribute 并以这种方式找到 Uri。
关于silverlight - MEF 和银光 : How do I navigate to a page in another XAP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6360993/