1. 首先通过WebClient下载Xap包。
/// <summary>
/// 下载应用
/// </summary>
/// <param name="name"></param>
private void DownloadApp(string name)
{
// 判断是否已下载
WebClient wc = new WebClient();
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
wc.OpenReadAsync(new Uri(name, UriKind.Relative), name);
}
2. 处理 OpenReadCompleted 事件。
/// <summary>
/// 设置异步下载完成中并引发 OpenReadCompleted 事件时所要执行的事件处理程序。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
// 隐藏下载进度条
if (e.Error == null && e.Cancelled == false)
{
// 在此要将下载的数据流转换成一个组件并加载到目前的AppDomain中。
// 将下载的数据流转换成一个组件。
Assembly assembly = LoadAssemblyFromXap(e.UserState.ToString(), e.Result);
// 创建 Silverlight 类库组件DLL中的用户控件类的实例。
UserControl page = (UserControl)assembly.CreateInstance("");
// 将实例添加到 Canvas 对象中,并显示。
canvasMain.Children.Add(page);
}
}
其中 LoadAssemblyFromXap用于将流转换成组件。
/// <summary>
/// 将数据流转换成组件
/// </summary>
/// <param name="relativeUriString"></param>
/// <param name="xapPackageStream"></param>
/// <returns></returns>
private Assembly LoadAssemblyFromXap(string relativeUriString, Stream xapPackageStream)
{
Uri uri = new Uri(relativeUriString, UriKind.Relative);
StreamResourceInfo xapPackageSri = new StreamResourceInfo(xapPackageStream, null);
StreamResourceInfo assemblySri = Application.GetResourceStream(xapPackageSri, uri);
AssemblyPart assemblyPart = new AssemblyPart();
Assembly assembly = assemblyPart.Load(assemblySri.Stream);
return assembly;
}
本文介绍如何使用WebClient下载Xap包,并将其转换为组件加载到当前AppDomain中。文章详细展示了从下载到加载的整个过程,包括处理OpenReadCompleted事件。
213

被折叠的 条评论
为什么被折叠?



