获取并使用通过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 );
你可以使用 `electron-dl` 模块的 `download` 函数来创建多个下载器,并获取每个下载对象。这个函数接受一个 URL 字符串或一个 `DownloadOptions` 对象作为参数。`DownloadOptions` 对象可以包含一些可选参数,比如设置下载文件的保存路径、文件名等。 以下是一个示例代码,展示如何使用 `electron-dl` 模块创建多个下载器,并获取每个下载对象: ```javascript const { download } = require('electron-dl'); const urls = [ 'https://example.com/file1.zip', 'https://example.com/file2.zip', 'https://example.com/file3.zip' ]; const downloaders = urls.map(url => { return download(BrowserWindow.getFocusedWindow(), url, { directory: '/path/to/save/directory' }); }); downloaders.forEach(downloader => { downloader.on('progress', progress => { console.log(`Downloaded ${progress.percent}%`); }); downloader.on('completed', downloadItem => { console.log(`Downloaded ${downloadItem.getFilename()}`); }); }); ``` 在上面的代码中,我们使用 `urls` 数组定义了需要下载文件的 URL。然后,我们使用 `map()` 方法遍历这个数组,为每个 URL 创建一个下载器。`download()` 函数的第一个参数是一个 `BrowserWindow` 对象,用于确定下载器的父窗口。第二个参数是 URL 字符串,第三个参数是一个 `DownloadOptions` 对象。我们把所有的下载对象存储在 `downloaders` 数组中。 最后,我们遍历 `downloaders` 数组,为每个下载对象绑定 `progress` 和 `completed` 事件的处理函数。这些事件可以帮助我们监控下载进度,并在下载完成后执行一些操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值