详解Silverlight导航框架与动态加载原理

开发 后端
在这里我们将介绍Silverlight导航框架与动态加载的相关知识,希望这些对大家更好的理解Silverlight有所帮助。

对于Silverlight导航框架,大家了解还不是很多,希望本文能让大家对Silverlight导航框架有跟深入的了解。特别是本文中很多部分在Visual Studio中完成。

1. Silverlight 3 的导航框架简介

Silverlight 提供了内置的导航框架,可以比较轻松的在 Silverlight Page 之间进行切换,并且可以和浏览器的前进、后退按钮集成,下面的代码可以简单的说明其用法:

代码

这段代码很简单,通过设置 HyperLinkButton 的 NavigationUri 和 TargetName 两个属性,可以让指定的 Frame 去加载指定的 Silverlight Page 。

2. 常见的动态加载解决方案

当 Silverlight 项目比较大的时候, 很自然的会想到将 Silverlight 项目拆分成多个 xap 文件,进行按需加载,这个实现起来也不难。通常的做法是使用 WebClient 或者 HttpWebRequest ,向服务端请求所需的 xap 文件,然后通过 xap 压缩包内的 AppManifest.xaml 文件,获取到 xap 文件内部打包的 dll 文件信息,在客户端通过反射进行加载。

3. 导航框架与动态加载相结合时遇到的问题,原因与解决方法

如果将这两者结合起来,利用 Sliverlight 内置的导航框架来加载动态加载的 xap 文件内部的 Silverlight Page ,对应用程序的开发和用户体验都是有很大帮助的:对开发方面来说,不用反射加载,而是使用 Silverlight 内置的导航框架,可以节省很多代码;对用户体验方面,按需加载能减少初始加载文件的大小,减少等待时间,使用导航框架可以和浏览器的前进、后退按钮紧密集成,用户体验更佳。

但是,在 Silverlight 3 目前的版本中, Frame 控件似乎不能直接加载动态加载的 Silverlight Page , 不管是通过设置 HyperLinkButton 的 NavigateUri 属性,还是通过调用 Frame.Navigate(Uri source) 方法,都会出现相同的异常, 看下面代码:

  1. var xap = "http://localhost:2704/AppSL.Web/ClientBin/TestSLApp.xap";  
  2. // LoadPackage 是加载 xap 的扩展方法  
  3. Deployment.Current.LoadPackage(xap, () => {  
  4.    var uri = new Uri("/TestSLApp;component/MainPage.xaml", UriKind.Relative);  
  5.    this.WidgetFrame.Navigate(uri);  
  6. }); 

当执行至 WidgetFrame.Navigate(uri) 时,会出现下面的异常:

异常代码

是什么原因导致这个异常呢? 通过 Reflector 察看 PageResourceContentLoader ,发现加载 x:Class 的是这个 GetTypeFromAnyLoadedAssembly 方法:

加载错误 

这个方法只是遍历 Deployment.Current.Part 去寻找所需要的类型,并没有去遍历动态加载的文件, 当然,这里也不可能去遍历。

看到这里,终于找到异常出现的原因了,由于这个方法是私有并且是静态的,无法进行重写,只能通过其它途径来解决。我想到的解决方法是,新建一个 Silverlight Page, 然后删除对应的代码文件,删除 xaml 视图的 x:Code 信息,如下图所示:

删除xaml视图

***的解决方案就是, 要做一个引导的文件,这个文件必须是一个独立的 xaml 文件,没有代码文件,没有 x:Class 信息,这样就不会被编译成新的类型,自然可以被 Silverlight 的导航框架加载了。

***说一句,不知道 Silverlight 以后的版本会不会考虑动态加载的问题呢? 据我所知, Flex 已经内置了模块动态加载的机制了。

原文标题:Silverlight 的导航框架与动态加载

链接:http://www.cnblogs.com/beginor/archive/2009/10/24/1589125.html

【编辑推荐】

  1. Office 2010将使用Silverlight改善用户体验
  2. 微软.NET平台主管谈Silverlight企业级开发
  3. Flash与Silverlight多领域实测对比
  4. 微软宣称Silverlight装机量超过三亿
  5. 图解Silverlight 3的7个新功能
责任编辑:彭凡 来源: 博客园
相关推荐

2016-12-02 20:43:34

Android动态加载DL框架

2021-10-24 06:50:52

AndroidClassLoaderJava

2011-06-24 09:01:20

Qt QLibrary dll

2009-09-07 13:25:56

Silverlight

2009-09-07 15:25:24

MySQL数据库互操作Silverlight

2012-09-12 10:35:51

Hyper-V

2009-07-10 12:00:27

2019-09-10 13:58:57

动态路由路由器网络

2011-10-10 09:11:09

Java

2009-12-31 16:56:40

Silverlight

2009-12-29 17:47:36

Silverlight

2009-12-31 10:07:08

Silverlight

2011-11-03 16:10:39

Silverlight

2009-12-31 15:13:47

Silverlight

2009-07-27 09:46:28

Silverlight

2009-12-31 17:31:23

Silverlight

2009-12-29 18:29:09

Silverlight

2009-12-30 14:36:29

Silverlight

2009-04-21 13:14:33

SilverlightWPF扩展

2009-09-27 10:03:53

Silverlight
点赞
收藏

51CTO技术栈公众号