在WPF中实现图片一边下载一边显示
2015-07-19 12:20
309 查看
当我们上网查看一个较大的图片时,浏览器能一边下载一边显示,这样用户体验是比较好的,但在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://www.cnblogs.com/TianFang/archive/2012/09/10/2679207.html
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://www.cnblogs.com/TianFang/archive/2012/09/10/2679207.html
相关文章推荐
- 500 OOPS:cannot change directory:/root 问题的解决方法
- 【Win10 应用开发】从前台应用触发后台任务
- Grails架设和配置--起步
- thinkphp
- 四、数组
- Java中的大数处理类BigInteger和BigDecimar浅析
- javaAPI(异常)
- linux挂载iso镜像时报错的解决方法 mount: can't find cdrom in /etc /fstab or /etc/mtab
- ActiveRecord-连接多张表之单表继承
- win8.1使用及优化
- 2015实习生面试记录
- Microsoft Dynamics CRM 2013 配置之 添加 Exchange server 2013
- 抽奖转盘
- Eclipse开发android安装环境
- [LeetCode][Java] Partition List
- <转>2015-7-14面试题
- 关于串口发送16进制编码及解码问题
- PWM例程__MK20DX128VLH5_K20系列
- float([x]): 将一个字符串或数转换为浮点数。如果无参数将返回0.0
- 加油