上一篇文章中老周给大伙介绍了x:Phase和x:Bind的用法,并演示了一个延迟加载的示例。不过,那个例子会遗留一个问题,就是UI线程被阻塞,所以启动应用较慢。

如果希望图片可以延迟加载,或许我们可以动动其他想法,对了,INotifyPropertyChanged接口可以成为突破口。

大伙伴们都知道,实现这个接口可以让类型支持属性更改通知,当属性的值被更新后,会及时更新用户界面上的显示内容。我的思路就是:在数据对象实例化时,先让其显示一张“占位”图片,即未有图片数据时显示的一张临时图片,然后再去拉取图片资源,当真正的图片资源拿到后再修改相应的属性,这样一来,UI会自动更新,用真正需要的图片替代前面显示的临时图片。

唉,看老周上面说得很神秘的样子,没事,咱们实战一下。

为了好演示,我就定义一个简单的类型,一个字符串类型的Name属性,和一个BitmapImage类型的Image属性,并实现INotifyPropertyChanged接口。

    public class ItemInfo : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName]string propName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
} #region 私有字段
private string m_name;
private BitmapImage m_image;
private static Random rand =new Random();
#endregion public ItemInfo(string _name, Uri _imageUri)
{
Name = _name;
// 初始图像
Image = new BitmapImage(new Uri("ms-appx:///images/0.png")); Task t = LoadImageAsync(_imageUri);
} public string Name
{
get { return m_name; }
set
{
if (value != m_name)
{
m_name = value;
OnPropertyChanged();
}
}
} public BitmapImage Image
{
get { return m_image; }
set
{
if (m_image != value)
{
m_image = value;
OnPropertyChanged();
}
}
} async Task LoadImageAsync(Uri uri)
{
// 模拟延迟
await Task.Delay(rand.Next(,));
// 更改图像
Image = new BitmapImage(uri);
}
}

在类型的构造函数中,调用LoadImageAsync方法去异步读取图片,读取成功后修改Image属性,这样也会使UI同步更新。

如果在UI上使用Image控件来显示图片,在图片更换一瞬间,由于要重新呈现,Image会发生一次闪烁。为了让这个闪烁能变得友好一些,我就想到把Image控件封装到一个用户控件里,当图片要更改时播放一个短暂的动画,这样一来,使得这个切换过程不那么刺眼。这个用户控件的XAML如下:

    <Grid>
<Image x:Name="img" />
<Rectangle x:Name="r" Opacity="0" Fill="LightGray"/>
</Grid>

Rectangle默认把它透明,不会挡住后面的图像,当要切换图像时,用动画让这个Rectangle挡一下后面的图片,这样会有一个瞬间的过度效果。

在代码中为这个用户控件声明一个依赖项属性,并且当属性更新时也更新控件里面的Image对象。

        static DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(UcIamgeShow), new PropertyMetadata(null, new PropertyChangedCallback(OnImageSourcePropertyChanged)));

        private static void OnImageSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
UcIamgeShow obj = d as UcIamgeShow;
obj.std?.Begin();
// 切换图片
obj.img.Source = e.NewValue as ImageSource;
} public ImageSource ImageSource
{
get { return (ImageSource)GetValue(ImageSourceProperty); }
set { SetValue(ImageSourceProperty, value); }
}

使用这个用户控件时,将ImageSource属性和数据源对象进行绑定即可。比如:

   <local:UcIamgeShow Width="150" Height="150" Margin="5" ImageSource="{Binding Image,Mode=OneWay}" />

大概原理就这样,大伙伴们可以下载示例源码自己玩耍。

看看最终的效果,可否满意。

示例源代码下载

【Win 10应用开发】延迟加载图片的另一种方法的更多相关文章

  1. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...

  2. 【Win 10应用开发】实现全屏播放的方法

    有人会问,以前的MediaElement控件不是有现成的一排操作按钮吗?而且可以直接进入全屏播放.是的,我们知道,以往的Store App都是在全屏模式下运行的,只要MediaElement控件填满整 ...

  3. iOS开发之动画编程的几种方法

    iOS开发之动画编程的几种方法 IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKe ...

  4. (OPC Client .NET 开发类库)网上很多网友都有提过,.NET开发OPC Client不外乎下面三种方法

    1. 背景 OPC Data Access 规范是基于COM/DCOM定义的,因此大多数的OPC DA Server和client都是基于C++开发的,因为C++对COM/DCOM有最好的支持.现在, ...

  5. Windows 10 应用创建模糊背景窗口的三种方法

    原文 Windows 10 应用创建模糊背景窗口的三种方法 现代的操作系统中创建一张图片的高斯模糊效果非常容易,不过如果要在窗口中获得模糊支持就需要操作系统的原生支持了.iOS/Mac 和 Windo ...

  6. 【转】c# Image获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...

  7. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  8. c# pictureBox1.Image的获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...

  9. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

随机推荐

  1. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

  2. ABP框架 - Swagger UI 集成

    文档目录 本节内容: 简介 Asp.net Core 安装 安装Nuget包 配置 测试 Asp.net 5.x 安装 安装Nuget包 配置 测试 简介 来自它的网页:“...使用一个Swagger ...

  3. Partition:分区切换(Switch)

    在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的,SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表 ...

  4. 清空Github上某个文件的历史版本

    title: 清空Github上某个文件的历史版本 author: 青南 date: 2015-01-08 16:04:53 categories: [经验] tags: [Github,histor ...

  5. WPF 微信 MVVM

    公司的同事离职了,接下来的日子可能会忙碌,能完善DEMO的时间也会少了,因此,把做的简易DEMO整体先记录一下,等后续不断的完善. 参考两位大神的日志:WEB版微信协议部分功能分析.[完全开源]微信客 ...

  6. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(70)-微信公众平台开发-成为开发者

    系列目录 前言: 一.阅读这段系列之前,你必须花半天时间大致阅读微信公众平台的API文档,我尽量以简短快速的语言与大家分享一个过程 二.借助微信公众平台SDK Senparc.Weixin for C ...

  8. netcore - MVC的ActionFilter的使用

    经过一周的时间没有分享文章了,主要是在使用.netcore做一个小的项目,项目面向大众用户的增删改查都做的差不多了,打算本周在云服务器上部署试试,很期待,也希望上线后大家多多支持:以上纯属个人废话,来 ...

  9. 浏览器中用JavaScript获取剪切板中的文件

    本文转自我的个人网站  , 原文地址:http://www.zoucz.com/blog/2016/01/29/get-file-from-clipboard/  ,欢迎前往交流讨论 在网页上编辑内容 ...

  10. 对Thoughtworks的有趣笔试题实践

    记得2014年在网上看到Thoughtworks的一道笔试题,当时觉得挺有意思,但是没动手去写.这几天又在网上看到了,于是我抽了一点时间写了下,我把程序运行的结果跟网上的答案对了一下,应该是对的,但是 ...