Silverlight:Downloader的使用(event篇)
(1)Downloader的使用
首先我们看什么是Downloader,就是一个为描述Silverlight plug-in下载功能的集合.Downloader能异步的通过HTTP GET Request下载内容.他是一个能帮助Silverlight下载内容的一个对象,这些下载内容包括(XMAL content,JavaScript content,ZIP packages,Media,images).当Silverlight plug-in安装时候,并不能完全提供所有应用程序的内容,但在一经请求这些内容就会响应应用程序的需要.更重要的是,你能在呈现内容后它仍然能被使用,而且不需要刷新业面.Downloader对象提供了初始数据传输的功能,通过事件和状态性质监控数据传输过程,并重新找到数据过程.
这个Downloader 对象的属性和方法模仿XMLHttpRequest(XHR)的一系列的APIs.XHR提供 JavaScript和其他Web浏览器脚本语言来传输和操作通过HTTP来于web Server端的XML数据.
通常你不详细指定Downloader 的URI;但你能指定URIs,并使用URI的配置是最初在安装Silverlight plug-in所指定主机器的HTML页面的地址.Downloader不能被用来跨域下载文件(内容不是来于最初始主机也面的地址).
下面给出一个事列显示怎样create, initialize, and execute 一个下载请求.为一个 被操作者挂上两个事件是(Completed, DownloadProgressChanged),但被操作者没有被指定,还有DownloadFailed也没有被定义.所以你要自己写一个.
// Event handler for initializing and executing a download request.
function onMouseLeftButtonUp(sender, eventArgs)
{
// Retrieve a reference to the plug-in.
var slPlugin = sender.getHost();
// Create a Downloader object.
var downloader = slPlugin.createObject("downloader");
// Add DownloadProgressChanged and Completed events.
downloader.addEventListener("downloadProgressChanged", onDownloadProgressChanged);
downloader.addEventListener("completed", onCompleted);
// Initialize the Downloader request.
// NOTE: downloader APIs disallow file:\\ scheme
// you must run this sample over localhost: or off a server or the following call will fail
downloader.open("GET", "promo.png");
// Execute the Downloader request.
downloader.send();
}
function onMouseLeftButtonUp(sender, eventArgs)
{
// Retrieve a reference to the plug-in.
var slPlugin = sender.getHost();
// Create a Downloader object.
var downloader = slPlugin.createObject("downloader");
// Add DownloadProgressChanged and Completed events.
downloader.addEventListener("downloadProgressChanged", onDownloadProgressChanged);
downloader.addEventListener("completed", onCompleted);
// Initialize the Downloader request.
// NOTE: downloader APIs disallow file:\\ scheme
// you must run this sample over localhost: or off a server or the following call will fail
downloader.open("GET", "promo.png");
// Execute the Downloader request.
downloader.send();
}
(2):DownloadFailed
当下载请求完成时没有下载内容时触发.
参数:
参数名 | 描述 |
类型 |
downloaderObject |
一个Downloader对象. | Object |
token | 是一个函数的返回值,能随意的保留如变量.如你想要调用RemoveEventLister去删除这个被操作者,你将需要这个参数 | integer |
eventhandlerFunction | 在脚本中被定义的你的事件函数名,当使用AddEventListener pararmeter,就不需要提供函数名. | Object |
sender |
识别调用事件的对象 |
Object |
eventArgs |
参数始终为 null | Object |
DownloadFailed 当下载请求完成时没有下载内容时触发.异步的调用Downloader的Send方法.主要由Status和StatusText的属性来反应HTTP的状态值来确定错误的下载请求.
你还能在脚本中添加一个事件名来添加操作者:
downloaderObject.AddEventListener("DownloadFailed", "eventhandlerFunction")
这里就回返回一个token;删除操作时这个token就不是绝对需要,在这里是添加操作.所以需要.
DownloadFailed当下载请求完成时没有下载内容时触发,你使用一个Completed事件去取得Downloader对象所响应的文本.当你正在下载发生突发的错误,你将还是能添加一个DownloadFailed事件到你的应用程序和为DownloadFailed事件写入适当代码,最终解决你的内容不存在的问题.
(3)DownloadProgressChanged
在求情下载期间被出发.
参数:
参数名 | 描述 |
类型 |
downloaderObject |
一个Downloader对象. | Object |
token | 是一个函数的返回值,能随意的保留如变量.如你想要调用RemoveEventLister去删除这个被操作者,你将需要这个参数 | integer |
eventhandlerFunction | 在脚本中被定义的你的事件函数名,当使用AddEventListener pararmeter,就不需要提供函数名. | Object |
sender |
识别调用事件的对象 |
Object |
eventArgs |
参数始终为 null | Object |
DownloadProgressChanged 事件能被使用监控下载进程.DownloadProgressChanged是按照被下载内容总长度的0.05显示,最高可达到1.0.当下载状态改变时都将出发Completed 或DownloadFailed.
你还能在脚本中添加一个事件名来添加操作者:
downloaderObject.AddEventListener("DownloadProgressChanged", "eventhandlerFunction")
语法这里还是就回返回一个token;删除操作时这个token就不是绝对需要,在这里是添加操作.所以需要.
在事件数据中这个进程要数不能被转载.取而代之的是使用Downloader对象的属性触发事件.That object is always the sender of the event.
------------------------------------------------------------
// Event handler for updating visual progress indicator
function onDownloadProgressChanged(sender, eventArgs)
{
// Calculate the downloaded percentage.
var percentage = Math.floor(sender.downloadProgress * 100);
// Update the Rectangle and TextBlock objects of the visual progress indicator.
progressText.text = percentage + "%";
progressRectangle.width = percentage * 2;
}
function onDownloadProgressChanged(sender, eventArgs)
{
// Calculate the downloaded percentage.
var percentage = Math.floor(sender.downloadProgress * 100);
// Update the Rectangle and TextBlock objects of the visual progress indicator.
progressText.text = percentage + "%";
progressRectangle.width = percentage * 2;
}
(4)Completed
在请求下载内容完成时触发.
Completed在请求下载内容完成时触发.异步的调用Downloader的Send方法.主要由Status和StatusText的性质来反应HTTP的状态值来确定错误的下载请求.
你还能在脚本中添加一个事件名来添加操作者:
downloaderObject.AddEventListener("Completed", "eventhandlerFunction")
语法这里还是就回返回一个token;删除操作时这个token就不是绝对需要,在这里是添加操作.所以需要.
Completed在请求下载内容完成时触发.并返回下载内容,你使用一个Completed事件去取得Downloader对象所响应的文本,在选择使用ResponseText性质或GetResponseText方法时.依赖于下载方式是否以包的形式,如是包的形式你就要指定part.
事例是定义一个取得下载内容的Completed事件函数,是单个文件下载(没有使用包)
// Event handler for the Completed event.
function onCompleted(sender, eventArgs)
{
// Retrieve downloaded XAML content.
var xamlFragment = sender.ResponseText;
// Create the objects from the XAML content.
var plugin = sender.getHost();
var button = plugin.content.createFromXaml(xamlFragment);
// Add downloaded XAML content to the root Canvas of the plug-in.
var rootCanvas = sender.findName("rootCanvas");
rootCanvas.children.add(button);
}
function onCompleted(sender, eventArgs)
{
// Retrieve downloaded XAML content.
var xamlFragment = sender.ResponseText;
// Create the objects from the XAML content.
var plugin = sender.getHost();
var button = plugin.content.createFromXaml(xamlFragment);
// Add downloaded XAML content to the root Canvas of the plug-in.
var rootCanvas = sender.findName("rootCanvas");
rootCanvas.children.add(button);
}