机电工程署;Silverlight:如何在另一个XAP中导航到页面?

机电工程署;Silverlight:如何在另一个XAP中导航到页面?,silverlight,silverlight-4.0,mef,Silverlight,Silverlight 4.0,Mef,我不知道该怎么做 我了解MEF,可以使用在许多博客文章中找到的无处不在的DeploymentCatalogService从另一个XAP加载服务和类。我不明白的是如何从另一个XAP加载并导航到一个页面 我想做的是让我的主应用程序能够调用NavigationService,并为它提供应该存在的页面名称。比如: NavigationService.Navigate(new Uri("/Test", UriKind.Relative)); 将此页面提供给应用程序取决于其他XAP文件之一。然而,我不知

我不知道该怎么做

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

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

 NavigationService.Navigate(new Uri("/Test", UriKind.Relative));
将此页面提供给应用程序取决于其他XAP文件之一。然而,我不知道如何使这项工作。似乎每个人都在建立一些复杂的基础设施来处理这种情况,这是非常烦人和过于复杂的


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

我看到的一些例子比它们需要的要复杂,但这不是一项简单的任务。我花了两天的时间来分解我能找到的例子,然后才真正理解到底发生了什么

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

您的INavgiationContentLoader应该执行以下操作

开始加载

  • 测试Uri是否属于当前XAP或已加载的XAP。
    • 如果没有,请使用DeploymentCatalog下载XAP。将DeploymentCatalog存储在AggregateCatalog中
  • 使用ExportFactory为给定Uri创建页面。在你的iSyncResult上给你自己一个财产来持有这个
  • 如果操作尚未取消,请执行回调参数
  • 罐头

    您可以尝试在这里放入一些逻辑来测试您是否有权访问指定的XAP,或者您可以只返回true并完成它

    取消装载

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

    端载

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

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

    编辑

    我的精力不足

    我最后的结果

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

    IExportPageMetaData。这是MEF使用的合同

    如何使用:

    声明您的导航:框架如下

    <navigation:Frame x:Name="ContentFrame"
                      Source="/Home"`
                      Grid.Column="1"> 
        <navigation:Frame.ContentLoader>
            <navUtil:DynamicContentLoader />
        </navigation:Frame.ContentLoader>
    </navigation:Frame>
    
    
    
    Hyperlink按钮从另一个XAP链接到页面

    <HyperlinkButton Content="Page from another XAP"
                     NavigateUri="/NavigateUriFromExportPageAttribute"
                     navUtil:DynamicContentLoader.Xap="UriToOtherXap" />
    
    
    
    从该XAP链接到页面的Hyperlink按钮

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

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

    请查看发布内容。这正是你需要的。文章的来源也可以找到。

    正如你提到的,在网上可以找到的例子很难理解,你有没有找到任何简单的例子来说明如何做到这一点。你提到你分解了这个例子,我想你手头有一个简单得多的例子,你有可能发布一个下载链接吗?谢谢cadrell0。INavigationContentLoader是我缺少的部分。我终于找到了Glenn Block的一个样本,这个样本相当简单,尽管他是作为ContentLoader的一部分执行XAP下载的,我希望这是一件独立的事情。现在我可以加载页面;只是还不能打电话给服务部。感谢你的回复。是的,这是我看过的样本之一。只是花了很长时间摸索。。。