silverlight - MEF 和银光 : How do I navigate to a page in another XAP?

标签 silverlight silverlight-4.0 mef

我对如何做到这一点很迷茫。

我了解 MEF,并且可以使用在许多博客文章中发现的无处不在的 DeploymentCatalogService 从另一个 XAP 加载服务和类。我不明白的是如何从另一个 XAP 实际加载和导航到 PAGE。

我想要做的是让我的主应用程序能够调用 NavigationService 并为其提供应该存在的页面名称。喜欢:

 NavigationService.Navigate(new Uri("/Test", UriKind.Relative));

将此页面提供给应用程序取决于其他 XAP 文件之一。但是,我不知道如何进行这项工作。似乎每个人都在构建一些复杂的基础设施来处理这种情况,这非常烦人且过于复杂。

有没有简单的方法来做到这一点?

最佳答案

我见过的一些例子比他们需要的更复杂,但这不是一项简单的任务。在我真正理解发生了什么之前,我花了 2 天的时间来分解我能找到的例子。

为此,您至少需要创建两个类。 一个实现 INavigationContentLoader 的类,这将完成所有工作。 实现 IAsyncResult 的类。该对象将在 INavigationContentLoader 周围传递,因此请使用它来跟踪您正在做的事情。

您的 INavgiationContentLoader 应该执行以下操作。

开始加载

  1. 测试Uri 属于当前XAP 还是已经加载的XAP。
    • 如果没有,请使用 DeploymentCatalog 下载 XAP。将 DeploymentCatalog 存储在 AggregateCatalog 中。
  2. 使用 ExportFactory 为给定的 Uri 创建页面。在 IAsyncResult 上给自己一个属性来保存它。
  3. 如果操作没有被取消,则执行回调参数。

可以加载

您可以尝试在此处放置一些逻辑来测试您是否可以访问指定的 XAP,或者您可以返回 true 并完成它。

取消加载

在 IAsyncResult 中设置一个状态,让您知道操作已被取消。

结束加载

  1. 获取存储在 IAsyncResult 中的页面,将其包装在 LoadResult 中并返回。


将由此 INavgiationContentLoader 加载的所有页面都需要用 ExportAttribute 标记,以便 ExportFactory 可以找到它们。

编辑

我的 INavigationContentLoader

http://pastebin.com/cT1mJ4Ve

我的 IAsyncResult

http://pastebin.com/xHWHT4pr

要在页面上使用的 ExportAttribute。您需要在所有 页面上使用它,甚至是本地 XAP 中的页面。

http://pastebin.com/nTJ27mWz

IExportPageMetaData。这是 MEF 使用的契约(Contract)。

http://pastebin.com/8fdwx2Kn

使用方法:

声明你的导航:像这样的框架

<navigation:Frame x:Name="ContentFrame"
                  Source="/Home"`
                  Grid.Column="1"> 
    <navigation:Frame.ContentLoader>
        <navUtil:DynamicContentLoader />
    </navigation:Frame.ContentLoader>
</navigation:Frame>

HyperlinkBut​​ton 到另一个 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/

相关文章:

c# - 如何创建将在子目录中搜索插件的 DirectoryCatalog

c# - 为什么使用 .net 4 最终版本的 MEF 后 GetExportedValues<T>() 不再起作用?

.net - wcf 服务绑定(bind)中的相对 url

silverlight - 在Windows 7 Phone中播放音频文件

c# - 禁用调整浏览器 Silverlight 4 窗口的大小

c# - 如何在 Silverlight 4 中手动调用/引发鼠标事件?

silverlight - 浏览器弹出窗口 WIndows 和 Silverlight OOB

c# - 唯一ID号C#

c# - 更改控件内容时显示交叉淡入淡出(或其他)过渡

asp.net-mvc-3 - MEF 和 MVC 3 - 如何从 mef 容器动态加载嵌入 View ?