前言:在做一个系统时,我们往往或把系统模块化,不同业务分不同的模块,模块之间互不联系,独立化,方面维护和扩展。
在做一个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:最后看运行效果
