【问题标题】:MEF & Silverlight: How do I navigate to a page in another XAP?MEF 和 Silverlight:如何导航到另一个 XAP 中的页面?
【发布时间】:2011-06-15 16:24:59
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: silverlight silverlight-4.0 mef


    【解决方案1】:

    我看到的一些示例比它们需要的复杂得多,但这不是一项简单的任务。在我真正理解发生了什么之前,我花了 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 使用的合约。

    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" />
    

    HyperlinkBut​​ton 到此 XAP 中的页面。

    <HyperlinkButton Content="Page from this XAP"
                     NavigateUri="/NavigateUriFromExportPageAttribute" />
    

    您不需要 UriMapper,也不需要放置 Page.xaml 的路径。 MEF 将从页面中读取 ExportPageAttribute 并以这种方式找到 Uri。

    【讨论】:

    • 正如你提到的,可以在网上找到的例子很难理解,你有没有找到任何简单的例子来说明如何做到这一点。您提到您分解了示例,我想您手头有一个更简单的示例,您可以发布下载链接吗?
    • 感谢 cadrell0。 INavigationContentLoader 是我缺少的部分。我终于找到了 Glenn Block 的一个相当简单的示例,尽管他正在执行 XAP 下载作为 ContentLoader 的一部分,我希望它是一个单独的东西。现在我可以加载页面了;只是还不能调用服务。感谢您的回复。
    【解决方案2】:

    查看Navigating between Pages in Different Xaps (by using MEF)http://www.silverlightshow.net 上的帖子。这正是您所需要的。帖子的来源也是可用的。

    【讨论】:

    • 是的,那是我看过的样本之一。只是花了很长时间去摸索......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多