博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在WPF中实现图片一边下载一边显示
阅读量:5866 次
发布时间:2019-06-19

本文共 1139 字,大约阅读时间需要 3 分钟。

原文 

当我们上网查看一个较大的图片时,浏览器能一边下载一边显示,这样用户体验是比较好的,但在WPF程序中,当我们通过如下方式显示一幅图片时:

    img.Source = new BitmapImage(new Uri("http://localhost:8000/www/test.jpg"));

只能等到图片下载完成时才能显示出来,当图片较大时需要等待很久,即使在旁边放个进度条给人的感觉仍然不好。

今天试了一下,这个效果还算比较容易实现的:在下载过程中,每隔一秒钟(也可以改成按下载进度)将当前下载的所有内容生成一个临时图片,将控件显示为临时文件即可。

代码如下:

    public MainWindow()
    {
        InitializeComponent();
        DownloadImage();
    }
    async void DownloadImage()
    {
        var request = WebRequest.Create("http://localhost:8000/www/test.jpg");
        using (var response = await request.GetResponseAsync())
        using (var destStream = new MemoryStream())
        {
            var responseStream = response.GetResponseStream();
            var downloadTask = responseStream.CopyToAsync(destStream);
            RefreshUI(downloadTask, destStream);
            await downloadTask;
        }
    }
    async void RefreshUI(Task downloadTask, MemoryStream stream)
    {
        await Task.WhenAny(downloadTask, Task.Delay(1000));            //每隔一秒刷新一次
        var data = stream.ToArray();
        var tmpStream = new MemoryStream(data);        //TODO 当图片的头没有下载到时,这儿可能抛异常
        var bmp = new BitmapImage();
        bmp.BeginInit();
        bmp.StreamSource = tmpStream;
        bmp.EndInit();
        img.Source = bmp;        //刷新图片
        if (!downloadTask.IsCompleted)
            RefreshUI(downloadTask, stream, contentLength);
    }
 

 

转载地址:http://rhnnx.baihongyu.com/

你可能感兴趣的文章
车主如何不花一分钱不出一份力处理交通事故
查看>>
python 库安装方法及常用库
查看>>
cocos2dx 3.x(移动修改精灵坐标MoveTo与MoveBy)
查看>>
【215】◀▶ IDL 文件操作说明 (黑底)
查看>>
MYSQL 查看可用的字符集的 2 方法
查看>>
正则表达式
查看>>
常用数据库连接池
查看>>
Java异常处理和设计
查看>>
如何对内部服务器实现负载平衡
查看>>
新的 Windows Azure 网络安全性白皮书
查看>>
【USACO2005Dec】奶牛的站位 Layout
查看>>
简单修改hosts文件加快打开网页速度
查看>>
i++的原子性问题
查看>>
LeetCode--217--存在重复元素
查看>>
登录必备
查看>>
一个现成的安装驱动工具可用
查看>>
Ext.Array 方法
查看>>
POI生成WORD文档
查看>>
jQuery-点击查看联系方式
查看>>
图片轮播
查看>>