MEF& Silverlight:如何导航到另一个XAP中的页面?

时间:2011-06-15 16:24:59

标签: silverlight silverlight-4.0 mef

我很失落如何做到这一点。

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

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

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

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

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:3)

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

要执行此操作,您需要创建至少两个类。 一个实现INavigationContentLoader的类,这将完成所有工作。 实现IAsyncResult的类。这个对象将传递给INavigationContentLoader,所以用它来跟踪你在做什么。

您的INavgiationContentLoader应执行以下操作。

BeginLoad

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

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

    CancelLoad

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

    端负载

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

    2. 此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。

答案 1 :(得分:1)

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

相关问题