Using Events to Download Files
Silverlight events can also be used in other ways that don't involve require user interaction. In Silverlight you can use a built-in Downloader object to download files used by an application on-the-fly. This functionality is useful when you need to download several images as an application initializes or need to download XAML fragments or other file types on demand as a user performs an action.
The Silverlight Downloader object exposes three events as in Table 2.
Event |
Description |
Completed |
Fires when a download completes. |
DownloadFailed |
Fires when a download fails due to no content being returned. |
DownloadProgressChanged |
Fires as a download progresses and provides the percentage of the file that has been downloaded. |
Listing Three provides an example of using the Silverlight Downloader object and handling its events. The code starts by creating the Silverlight object instance using the standard Silverlight.createObjectEx() method. Within this method the onLoad event is hooked to an event handler of the same name. The onLoad() event handler creates the Downloader control using the CreateObject() method and then wires its events to their respective event handlers using the AddEventListener() method. Once the events are wired up it then defines the file to download and calls Send() to start the download.
As the file is downloaded the onDownloadProgressChanged() event handler is called which is used to get the download progress. The code then updates a TextBlock object's Text property with the percentage of the download that has completed. When the file download completes the onCompleted() event handler is called which provides the user with an updated status.
var _TB = null; function CreateSilverlight() { Silverlight.createObjectEx( { source: "MyApp.xaml", parentElement: document.body, id: "slControl", properties: { width: "100%", height: "100%", version: "1.0" }, events: { onLoad: onLoad, onError: null } } ); } function onLoad(control, context, rootElement) { _TB = control.Content.FindName("tbProgress"); var downloader = control.CreateObject("downloader"); downloader.AddEventListener("DownloadProgressChanged", onDownloadProgressChanged); downloader.AddEventListener("Completed", onCompleted); downloader.AddEventListener("DownloadFailed", onDownloadFailed); downloader.Open("GET", "MyFiles.zip?" + new Date()); downloader.Send(); } function onDownloadProgressChanged(sender, eventArgs) { var percentComplete = sender.DownloadProgress * 100; _TB.Text = Math.floor(percentComplete) + "%"; } function onCompleted(sender, eventArgs) { _TB.Text = "Download complete!"; //Access files that were downloaded } Function onDownloadFailed(sender, eventArgs) { //eventArgs will always be null in this event handler alert("Download failed"); }
Conclusion
Events are where it's at in the world of application development. By defining events in XAML and handling them in JavaScript you can build a Silverlight application that is responsive to end user actions.