获取并使用通过Downloader对象下载的内容

在《Silverlight中的Downloader对象》一文中,我们已经了解了一些关于Downloader的基本概念,以及如何使用Downloader来下载文件并根据需要触发一些事件。而本文我们将看一看在下载结束后,该怎样根据需要处理下载下来的文件。

处理下载下来的文件一般都在Completed事件的事件处理函数中。大多数情况下,我们需要用Downloader下载的文件可以分为如下几类:包含Silverlight中界面元素的XAML文件或处理逻辑的js文件,各种媒体文件(如图片、视频等等),字体文件,以及包含各种类型文件的压缩包文件(.zip文件)。接下来我们就这几种类型分别说明一下。并假设我们的Completed事件处理方法名为onCompleted

1. 获取并使用下载的XAML元素

如果下载的是单个文件,而不是压缩包(.zip)的话,使用ResponseText 属性即可得到下载的文件。ResponseText表现为一个字符串,表示下载的文件名。要将下载的XAML中的对象加载到正在运行的Silverlight控件中,我们需要从下载的XAML中生成一个XAML元素对象。CreateFromXAML方法可以帮助我们实现这一点。其返回值为XAML对象的引用。

下面的这个例子即将下载的XAML加载到Silverlight控件中(假设下载的文件为描述背景画面的XAML片断)。这个例子首先查看uri属性来判断下载下来的文件是否是我们所需要的那个。调用Downloader.send() 方法会将文件的URI赋予该属性。

// Completed事件的处理函数
function onCompleted(sender, eventArgs)
......{
//使用uri属性保证要处理的下载的文件正确
if (sender.uri == "background2.xaml")
......{
// 获得下载的文件内容
var xamlFragment = sender.ResponseText;

// 从XAML中创建对象
var plugin = sender.getHost();
var background= plugin.content.CreateFromXaml(xamlFragment);

// 将创建的对象加入到根Canvas中
var rootCanvas = sender.findName("rootCanvas");
rootCanvas.children.add(background);
}
}

上面的例子为xamlFragment开辟了一个存储空间,通过使用xamlFragment变量来保存ResponseText的值,然后再通过该变量创建XAML对象的引用。我们也可以使用CreateFromXAMLDownloader方法直接从下载的XAML片断中创建对象。基本用法如下:

function onCompleted(sender, eventArgs)
.........{
//使用uri属性保证要处理的下载的文件正确
if (sender.uri == "background2.xaml")
.........{
var slPlugin = sender.getHost();

//获得XAML片断并创建XAML对象引用
var background= slPlugin.content.CreateFromXamlDownloader(sender, "");

// 将创建的对象加入到根Canvas中
var rootCanvas = sender.findName("rootCanvas");
rootCanvas.children.add(background);
}
}

CreateFromXamlDownloader方法包含两个参数,第一个参数表示的是Downloader对象,第二个参数表示压缩包中的文件名,如果下载的不是压缩包,则这个参数为空字符串。

获取压缩包中的某个文件 

CreateFromXamlDownloader方法中可以指明压缩包中的某个文件。比如,我们使用downloader.open("GET", "background.zip") 下载了一个包含了多个描述背景的XAML文件,其中一个文件为background2.xaml,通过如下方法可以直接从background2.xaml中创建对象引用:

var background= slPlugin.content.createFromXamlDownloader(sender, "background2.xaml");

同样的,如果只是要从压缩包中获得下载的文件内容,可以使用GetResponseText方法,该方法中包含了一个指明文件名的参数。使用方法如下:

var background= sender.getResponseText("bakcground2.xaml");

2. 使用下载的媒体文件

如果要使用下载的媒体文件,如图片、视频等等,可以使用SetSource方法,将媒体元素的路径源设置为下载的文件。与CreateFromXAMLDownloader方法类似,SetSource方法接受两个参数,第一个参数表示的是Downloader对象,第二个参数表示压缩包中的某个文件名,如果下载的不是压缩包,则这个参数为空字符串。如,当我们想要让当前Silverlight控件中的图片元素myBackground显示为下载下来的图片文件background.png,可以使用如下代码:

function onCompleted(sender, eventArgs)
......{
// 从当前Silerlight控件中获得myBackground元素对象
var myBackground= sender.findName("myBackground");

// 若下载的文件为压缩包,则将setSource的第二个参数赋值为压缩包中的某个图片文件的名字
// 否则,若下载的是一个单个的图片文件,则第二个参数为空字符串
myBackground.setSource(sender, "background.png");
}

3. 使用下载的字体文件

Silverlight可以接受.tff字体。使用下载的字体文件则要使用SetFontSource方法。SetFontSource方法接受一个参数,其值为包含下载内容的Downloader对象。要使字体生效,除了对字体元素对象使用SetFontSource方法外,还要为其FontFamily属性赋予相应的值。

function onCompleted(sender, eventArgs)
......{
// 获得TextBlock对象
var myTextBlock = sender.findName("myTextBlock");

// 将下载的对象中的字体文件加入到TextBlock的类型集合中
myTextBlock.setFontSource(sender);

// 将字体的类型名赋予TextBlock的FontFamily属性
myTextBlock.fontFamily = "Contoso Font";
}

如果要恢复使用默认的字体属性,则可以将SetFontSource的参数设为null。

var myTextBlock = sender.findName("myTextBlock");

// 移除自定义的字体属性
myTextBlock.setFontSource(null);