孟宪会ID:net_lover
880794次访问,排名30好友199人,关注者0
http://dotnet.aspx.cc/
【声明:各位好,由于系统“添加好友”功能只能添加200个,后来的朋友不能加入,见谅!!!】
net_lover的文章
原创 243 篇
翻译 2 篇
转载 5 篇
评论 845 篇
孟宪会的公告
欢迎光临!您在阅读的过程中有任何建议或者意见,请发邮件或者留言,合作愉快!
最近评论
onlytiancai:这个可以公开吗?
PrideRock:你发这文章是留备份还是啥意思?给讲讲?
lfywy:确实不错,经测试,很不错!感谢孟子分享!
lczddd:牛人就是牛人,不是一般的牛,是巨牛,呵呵
junon:ASPNET20Book.xls
这个文件怎么创建啊?
文章分类
收藏
    相册
    文章用图
    【孟子E章】站点
    【孟子E章】站点(RSS)
    【孟子E章】网摘(RSS)
    【孟子E章】网站(RSS)
    Silverlight 1.0 SDK 中文版
    Silverlight 1.0 SDK 中文版
    【网上邻居】
    .Net开发资源中心
    【兔子】专栏
    AppleVB 主页
    Estyle(靳田)之狂想手扎
    huahaoyueyuan
    JavaProgramers的专栏
    意玺的BLOG
    最爱白菜
    枕善居VB.NET源码博客
    美丽眼睛看世界
    阿赖
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 Silverlight 2学习教程(七):在Silverlight 2.0中制作资源加载进度条收藏

    新一篇: 我也说说:用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败 | 旧一篇: Windows XP With SP3 简体中文版下载

    Silverlight 2.0去掉了原来的downloader对象,代之以WebClient对象。WebClient类为Silverlight插件提供了一整套的HTTP客户端功能。可以下载应用程序数据,比如XAML内容,附加的程序集或者诸如图片的媒体文件。WebClient类可以根据程序的需要下载内容,可以异步呈现或者利用下载的内容,而不是随HTML页面一起下载。如果你要按照一定的序列替换Silverlight内容,不需要刷新页面。比较常见的来自是从视频库中播放视频,但本节是以播放图片为例子的。

    关于WebClient

    WebClient请求是异步的,大部分的交互操作都是依靠事件处理器来完成的。通常,需要定义如下中的一个或者多个处理器函数。

    • ■ 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;
            }
        }
    }

    运行过程中的界面和最终运行结果如下:

    发表于 @ 2008年05月05日 22:34:00|评论(loading...)|编辑

    新一篇: 我也说说:用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败 | 旧一篇: Windows XP With SP3 简体中文版下载

    评论

    #spy2008 发表于2008-05-08 14:55:46  IP: 218.56.228.*
    学习
    #davidjava 发表于2008-05-27 10:14:25  IP: 219.131.224.*
    挺牛逼的
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 孟宪会