Xuan.UWP.Framework(2)
上一章主要介绍了Xuan.UWP.Framework.ImageLib的基本用法,这一章具体来看些Xuan.UWP.Framework.ImageLib的使用。
一、首先看下Xuan.UWP.Framework.ImageLib中最主要的class之一的ImageLoader。

可以看到ImageLoader采用单例模式,外部提供的方法为CaheImageAsync,GetImageStreamAsync和GetStorageFileFromCache三个方法。第一个方法CaheImageAsync是提供了外部StorageFile 缓存共同管理。GetImageStreamAsync提供了获取下载图片的Stream,GetStorageFileFromCache可以通过url来获得缓存的图片用于图片处理或者分享等等。
例如:
using (var stream = await ImageLib.ImageLoader.GetInstance.GetImageStreamAsync(@"http://ecx.images-amazon.com/images/I/512Pd6birKL.jpg",
null, new System.Threading.CancellationToken())) {
if (stream != null && stream.Size > ) {
var bit = new BitmapImage();
await bit.SetSourceAsync(stream);
img.Source = bit;
}
}
源码中 GetImageStreamAsync 使用了几个关键的方法GetStreamFromUriAsync和GetStreamFromCacheOrNetAsync
protected virtual async Task<IRandomAccessStream> GetStreamFromUriAsync(Uri uri, CancellationToken cancellationToken) {
switch (uri.Scheme) {
case "ms-appx":
case "ms-appdata": {
var file = await StorageFile.GetFileFromApplicationUriAsync(uri);
return await file.OpenAsync(FileAccessMode.Read).AsTask(cancellationToken).ConfigureAwait(false);
}
case "ms-resource": {
var rm = ResourceManager.Current;
var context = ResourceContext.GetForCurrentView();
var candidate = rm.MainResourceMap.GetValue(uri.LocalPath, context);
if (candidate != null && candidate.IsMatch) {
var file = await candidate.GetValueAsFileAsync();
return await file.OpenAsync(FileAccessMode.Read).AsTask(cancellationToken).ConfigureAwait(false);
}
throw new Exception("Resource not found");
}
default: {
return null;
}
}
}
protected virtual async Task<IRandomAccessStream> GetStreamFromCacheOrNetAsync(string url, DisplayImageOptions options) {
IRandomAccessStream randomStream = null;
randomStream = await GetStreamFromCacheAsync(url).ConfigureAwait(false);
if (randomStream == null) {
randomStream = await GetStreamFromNetAsync(url).ConfigureAwait(false);
if (options.CacheOnStorage && randomStream != null && randomStream.Size > ) {
await _config.StorageCache.SaveAsync(url, randomStream).ConfigureAwait(false);
}
}
return randomStream;
}
其中GetStreamFromUriAsync很简单通过uri的scheme来判断如果是本地资源文件将直接读取,如果是网络图片将使用GetStreamFromCacheOrNetAsync进行加载。如果存在本地缓存,将直接读取本地缓存,如果本地不存再缓存则将下载图片并缓存图片。GetStreamFromCacheOrNetAsync中的具体内容将放到下一章来介绍。
ImageLoader还包含了SourceProperty类型为DependencyProperty依赖属性这里可以认为是Image的附加属性。方便再Xaml中使用。
xmlns:imageloader="using:Xuan.UWP.Framework.ImageLib"
<DataTemplate x:Key="SimpleImageDataTemplate">
<Grid>
<Image imageloader:ImageLoader.Source="{Binding Url}" Width="200" Height="200"/>
</Grid>
</DataTemplate>
<Image x:Name="img" imageloader:ImageLoader.Source="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png"/>
二、ImageLoader再使用前需要配置ImageLoaderConfiguration 目前ImageLoaderConfiguration最终要的当属StorageCache,StorageCache可以自行实现抽象类StorageCacheBase。也可以使用默认实现StorageCache。

StorageCache 需要配置缓存的目录,以及文件名称的加密和缓存的时间。
public App() {
this.InitializeComponent();
this.Suspending += OnSuspending;
var configuration = new ImageLib.Config.ImageLoaderConfiguration.Builder()
.StorageCache(new ImageLib.Cache.StorageCache(ApplicationData.Current.LocalCacheFolder,
"test", new ImageLib.Cache.SHA1CacheGenerator(), 0))
.Build();
ImageLib.ImageLoader.GetInstance.InitConfig(configuration);
}
Github : https://github.com/skyyuxuan/Xuan.UWP.Framework
Xuan.UWP.Framework(2)的更多相关文章
- Xuan.UWP.Framework
开篇博客,以前总是懒,不喜欢写博客什么,其实都是给自己找理由,从今天开始有空就写写博客.新手博客,写得不好轻喷,哈哈! 开始正题,微软移动平台,从WP7开始,经历了WP8,然后WP8.1,到目前得Wi ...
- win10 uwp MVVM 轻量框架
如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...
- 2019-11-29-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199
title author date CreateTime categories win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 lindexi 2019-11-29 10:16: ...
- 2018-9-1-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199
title author date CreateTime categories win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 lindexi 2018-09-01 16:24: ...
- 2018-10-22-win10-uwp-自定义控件入门
title author date CreateTime categories win10 uwp 自定义控件入门 lindexi 2018-10-22 09:47:54 +0800 2018-10- ...
- 2018-8-10-win10-uwp-MVVM-轻量框架
title author date CreateTime categories win10 uwp MVVM 轻量框架 lindexi 2018-08-10 19:17:19 +0800 2018-2 ...
- windows类书的学习心得
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?
选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...
- [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)
前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...
随机推荐
- 牛客网多校训练第三场 A - PACM Team(01背包变形 + 记录方案)
链接: https://www.nowcoder.com/acm/contest/141/A 题意: 有n(1≤n≤36)个物品,每个物品有四种代价pi,ai,ci,mi,价值为gi(0≤pi,ai, ...
- 【[CQOI2014]数三角形】
lx让做的题,其实很简单,难度评到紫令人吃惊 首先读进来\(n,m\)先\(++\),之后就是一个格点数为\(n*m\)的矩阵了 我们直接求很那做,补集转化一下,我们容斥来做 首先所有的情况自然是\( ...
- 2019.1.10 Mac安装Nginx服务器
1.安装Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/in ...
- Windows 2008 Scheduled tasks result codes
0 or 0x0: The operation completed successfully. 1 or 0x1: Incorrect function called or unknown funct ...
- java使用类序列化反序列化(读写文件)
创建类:Role package com.wbg.springRedis.entity; import java.io.Serializable; public class Role implemen ...
- java中io创建文件和读取文件
简单了解IO流:https://www.cnblogs.com/weibanggang/p/10034325.html package com.wbg.iodemo1128; import java. ...
- Mysql 基本语句 + 高级查询
MySQL执行SQL脚本文件的命令: 从cmd进入mysql命令行模式: mysql> -uroot –prootpassword –Ddatabasename 如果是我本地的数据库,就相应修改 ...
- winform 实现定位
如何在winform中 导入地图实现定位功能 ? 从网上下个BaiDuMap.htm, 就是个js文件 在form中加入webBrowser控件,然后在窗体的加载事件中写入如下代码 webBro ...
- 6.可见性关键字(volidate)
可见性关键字(volidate): 如果对java内存模型了解较清楚的话,我们知道每个线程都会被分配一个线程栈. 线程栈里存的是对象的引用,但当前cache缓存机制,可能会把数据拷贝. 就是,命中缓存 ...
- JavaScript 时间对象 date()
getYear() 获得的是距离1900年过了多少年 var d = new Date(); document.write(d+"<br />"); document. ...