Silverlight 2.0去掉了原来的downloader对象,代之以WebClIEnt对象。WebClIEnt类为Silverlight插件提供了一整套的http客户端功能。可以下载应用程序数据,比如XAML内容,附加的程序集或者诸如图片的媒体文件。WebClIEnt类可以根据程序的需要下载内容,可以异步呈现或者利用下载的内容,而不是随HTML页面一起下载。如果你要按照一定的序列替换Silverlight内容,不需要刷新页面。比较常见的来自是从视频库中播放视频,但本节是以播放图片为例子的。
关于WebClIEntWebClIEnt请求是异步的,大部分的交互 *** 作都是依靠事件处理器来完成的。通常,需要定义如下中的一个或者多个处理器函数。
■ DownloadStringCompleted ■ OpenReadCompleted ■ DownloadProgressChanged
根据你请求的资源是字符串还是流,需要使用不同的API,当请求一个字符串时,可以调用下面的方法:
■ DownloadStringAsync(Uri) ■ DownloadStringAsync(Uri,Object)
然后再处理DownloadStringCompleted事件。
当请求的是一个流时,可以调用下面的方法:
■ OpenReadAsync(Uri) ■ OpenReadAsync(Uri,Object)
然后处理OpenReadCompleted事件。
OpenReadCompleted事件处理器基本的签名如下:
voID wc_OpenReadCompleted( object sender, OpenReadCompletedEventArgs e) {...
}
这个处理器中最相关的API是OpenReadCompletedEventArgs参数的Result属性,这个属性是Stream类型的,
可以直接使用这个属性,或者调用需要Stream对象的方法,也可以使用StreamReader对象或者其他访问流的API。
下面就是一个下载图片的例子,本例子通过输入文件路径,然后以进度条显示下载的状态,下载完毕后进行显示。
需要注意的是:给OpenReadAsync和DownloadStringAsync API制定的URI通常采用相对路径,
WebClIEnt不支持file协议下载,在进行测试的时候需要注意,必须建立站点进行测试。
可以使用httpS协议,但包含这个插件的HTML也必须同时是httpS协议才可以。在URI中不能使用反斜杠(/),
必须使用正斜杠(/)。
例子代码如下:
Page.xaml:
< UserControl x:Class ="SilverlightApplication3.Page"xmlns ="http://schemas.microsoft.com/clIEnt/2007"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
WIDth ="1024" Height ="800" >
< GrID x:name ="LayoutRoot" Background ="White" >
< Canvas Canvas.top ="0" >
< Rectangle name ="progressRectangle" Canvas.left ="20" Canvas.top ="10" Height ="10" WIDth ="0" Fill ="Navy" />
< Rectangle Canvas.top ="9" Canvas.left ="19" Height ="12" WIDth ="202" strokeThickness ="1" stroke ="Black" />
< TextBlock x:name ="progresstext" Canvas.top ="6" Canvas.left ="230" Text ="0%" FontSize ="12" />
< TextBox x:name ="filepath" Canvas.left ="20" WIDth ="100" Canvas.top ="26" Text ="p1.jpg" ></ TextBox >
< button Canvas.top ="26" Canvas.left ="130" Content ="下载文件" Click ="button_Click" ></ button >
< Image Canvas.left ="60" x:name ="img" Canvas.top ="60" WIDth ="1024" ></ Image >
</ Canvas >
</ GrID >
</ UserControl >
Page.xaml.cs:
using System;using System.Collections.Generic;
using System.linq;
using System.windows;
using System.windows.Controls;
using System.windows.documents;
using System.windows.input;
using System.windows.Media;
using System.windows.Media.Imaging;
using System.windows.Shapes;
using System.Net;
using System.IO;
using System.windows.Resources;
namespace SilverlightApplication3
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
}
private voID button_Click( object sender, RoutedEventArgs e)
{
img.source = null ;
WebClIEnt wc = new WebClIEnt();
if (wc.IsBusy)
{
wc.CancelAsync();
}
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
wc.OpenReadAsync( new Uri(filepath.Text, UriKind.relative));
}
voID wc_OpenReadCompleted( object sender, OpenReadCompletedEventArgs e)
{
BitmAPImage imgsrc = new BitmAPImage();
imgsrc.SetSource(e.Result as Stream);
img.source = imgsrc;
}
voID wc_DownloadProgressChanged( object sender, DownloadProgressChangedEventArgs e)
{
progresstext.Text = e.Progresspercentage.ToString() + " % " ;
progressRectangle.WIDth = ( double )e.Progresspercentage * 2 ;
}
}
}
运行过程中的界面和最终运行结果如下:
总结以上是内存溢出为你收集整理的转老孟一篇在Silverlight 2.0中制作资源加载进度条全部内容,希望文章能够帮你解决转老孟一篇在Silverlight 2.0中制作资源加载进度条所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)