前言:在做一个系统时,我们往往或把系统模块化,不同业务分不同的模块,模块之间互不联系,独立化,方面维护和扩展。
在做一个Silverlight时,可以把Silverlight应用程序当成是一个模块,一个解决方案中拆分多个Silverlight,一个Silverlight就是一个一个XAP包,XAP包下面有各个具体页面。
当调用某个模块式,加载这个XAP包,以及某个界面,就可以运行改业务操作。
1:解决方案如下:
其中:SilverlightApplication2为主程序,界面如下
2:当点击点开按钮时,动态加载Demo的一个页面
点击按钮代码如下
private void addxap_Click(object sender, RoutedEventArgs e) { //1 •使用WebClient下载SLRandarHitTest.xap文件,进行异步读取。 WebClient Appclient = new WebClient(); Appclient.OpenReadAsync(new Uri("Demo.xap", UriKind.Relative)); Appclient.OpenReadCompleted += new OpenReadCompletedEventHandler(Appclient_OpenReadCompleted); } void Appclient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { CreateXAPResource("Demo.dll", "Demo.MainPage", e.Result); } /// <summary> /// 创建XAP包的反射实例并且加装到Canvas中 /// </summary> /// <param name="dllStr">XAP包中的编译完成的运行代码的DLL文件</param> /// <param name="mainStr">需要实例化的启动页面</param> /// <param name="resultStream">使用WebClient下载到的数据流</param> private void CreateXAPResource(string dllStr, string mainStr, Stream resultStream) { //2 • //3 •获取其他包提供的资源流信息 StreamResourceInfo streamResourceInfo = Application.GetResourceStream(new StreamResourceInfo(resultStream as Stream, null), new Uri(dllStr, UriKind.RelativeOrAbsolute)); //4 •对Stream进行反射 AssemblyPart assemblyPart = new AssemblyPart(); Assembly assembly = assemblyPart.Load(streamResourceInfo.Stream); //5 •(创建实例 var uc = (UserControl)assembly.CreateInstance(mainStr); //主界面的容器
lRoot.Children.Clear(); lRoot.Children.Add(uc); }
3:最后看运行效果