在WPF中实现图片一边下载一边显示

简介: 原文 在WPF中实现图片一边下载一边显示 当我们上网查看一个较大的图片时,浏览器能一边下载一边显示,这样用户体验是比较好的,但在WPF程序中,当我们通过如下方式显示一幅图片时:     img.Source = new BitmapImage(new Uri("http://localhost:8000/www/test.jpg")); 只能等到图片下载完成时才能显示出来,当图片较大时需要等待很久,即使在旁边放个进度条给人的感觉仍然不好。

原文 在WPF中实现图片一边下载一边显示

当我们上网查看一个较大的图片时,浏览器能一边下载一边显示,这样用户体验是比较好的,但在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);
    }
 

 

目录
相关文章
|
Java
STM32CubeMX环境安装(保姆级)
STM32CubeMX环境安装(保姆级)
1167 0
|
存储 Linux 开发工具
8.2 Linux UID和GID
登陆 Linux 系统时,虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)。Linux 系统将所有用户的名称与 ID 的对应关系都存储在 /etc/passwd 文件中。
714 0
8.2 Linux UID和GID
UE DTDataTable 插件说明, 运行中操作CSV文件。
UE DTDataTable 插件说明, 运行中操作CSV文件。
983 0
|
消息中间件 运维 负载均衡
耗时一晚上,我梳理出了 2023 年微服务技术架构必会知识点!
耗时一晚上,我梳理出了 2023 年微服务技术架构必会知识点!
1085 0
|
Dubbo 前端开发 Java
Failed to bind NettyServer on ×××,cause: io/netty/bootstrap/ServerBootstrap
Failed to bind NettyServer on ×××,cause: io/netty/bootstrap/ServerBootstrap
Failed to bind NettyServer on ×××,cause: io/netty/bootstrap/ServerBootstrap
|
数据格式 JSON 存储
Lua模块的加载与内存释放
今天早上听说一件事情让我觉得很诡异的事情:公司线上的一款游戏,加载一份配置资源后,内存涨了几十M,然后内存再也下不来了。因为好奇,所以要来了最大的一个配置文件(4.5M,去除空格与换行后的大小),进行测试。
2527 0
|
11月前
|
API 数据库 数据安全/隐私保护
快递单p图生成器,在线单号转换工具, 快递单号制作器app
这个程序是一个合法的快递单号验证工具,包含以下功能:选择快递公司并验证单号格式
|
JSON 安全 Linux
Python日志库Loguru教程(最人性化的Python日志模块)
Loguru是一个旨在为Python带来愉悦的日志记录的库。在使用中可以让我们更加简便的使用日志功能,从而把精力放到要解决的问题上。
1893 0
Python日志库Loguru教程(最人性化的Python日志模块)
|
自然语言处理 API 索引
ElasticSearch实战教程PostMan版(超级详细版)
ElasticSearch实战教程PostMan版(超级详细版)
ElasticSearch实战教程PostMan版(超级详细版)