///<summary>

    /// 独立存储缓存的图片源

    /// 用法:item.img = new StorageCachedImage(newUri(http://www.baidu.com/12.jpg));

    ///</summary>

    public sealed class StorageCachedImage : BitmapSource

    {

        private readonly Uri uriSource;

        private readonly string filePath;

        private const string CacheDirectory = "CachedImages";

        static StorageCachedImage()

        { 

            //创建缓存目录

            using (var isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())

            {

                if (!isolatedStorageFile.DirectoryExists(CacheDirectory))

                {

                    isolatedStorageFile.CreateDirectory(CacheDirectory);

                }

            }

        }

        ///<summary>

        /// 创建一个独立存储缓存的图片源

        ///</summary>

        ///<param name="uriSource"></param>

        public StorageCachedImage(Uri uriSource)

        {

            this.uriSource = uriSource;

            string sUrl = uriSource.AbsolutePath;

            //文件路径

            filePath = Path.Combine(CacheDirectory, sUrl.Substring(sUrl.LastIndexOf("/") + 1, sUrl.Length - sUrl.LastIndexOf("/") - 1));

            OpenCatchSource();

        }

        ///<summary>

        /// 打开缓存源

        ///</summary>

        private void OpenCatchSource()

        {

            //网络可用时,下载图片(网络不可用时读取本地缓存)

            if (CommonConst.CheckNetWorking())

            {

                SetWebStreamSource();

            }

            else

            {

                bool exist;

                using (var isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())

                {

                    exist = isolatedStorageFile.FileExists(filePath);

                }

                if (exist)

                {

                    SetCacheStreamSource();

                }

                else

                {

                    //SetWebStreamSource();

                }

            }

        }

        ///<summary>

        /// 设置缓存流到图片

        ///</summary>

        private void SetCacheStreamSource()

        {

            using (var isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())

            using (var stream = isolatedStorageFile.OpenFile(filePath, FileMode.Open, FileAccess.Read))

            {

                SetSource(stream);

            }

        }

        ///<summary>

        /// 下载Uri中的图片

        ///</summary>

        private void SetWebStreamSource()

        {

            var httpWebRequest = (HttpWebRequest)WebRequest.Create(uriSource);

            httpWebRequest.AllowReadStreamBuffering = true;

            httpWebRequest.BeginGetResponse(ResponseCallBack, httpWebRequest);

        }

        ///<summary>

        /// 下载回调

        ///</summary>

        ///<param name="asyncResult"></param>

        private void ResponseCallBack(IAsyncResult asyncResult)

        {

            var httpWebRequest = asyncResult.AsyncState as HttpWebRequest;

            if (httpWebRequest == null) return;

            try

            {

                var response = httpWebRequest.EndGetResponse(asyncResult);

                using (var stream = response.GetResponseStream())

                using (var isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())

                using (var fileStream = isolatedStorageFile.OpenFile

                (filePath, FileMode.OpenOrCreate, FileAccess.Write))

                {

                    CopyStream(stream, fileStream);

                }

                Dispatcher.BeginInvoke(SetCacheStreamSource);

            }

            catch (Exception err)

            {

                //Debug.WriteLine(err.Message);

            }

        }

        private static void CopyStream(System.IO.Stream input, IsolatedStorageFileStream output)

        {

            byte[] buffer = new byte[32768];

            long TempPos = input.Position;

            int readCount;

            do

            {

                readCount = input.Read(buffer, 0, buffer.Length);

                if (readCount > 0)

                {

                    output.Write(buffer, 0, readCount);

                }

            } while (readCount > 0);

            input.Position = TempPos;

        }

    }

WP_从独立存储区读取缓存的图片的更多相关文章

  1. C#从证书存储区读取证书

    using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...

  2. WP开发图片保存到独立存储并从独立存储中读取

    需要添加引用命名空间 using System.IO; using System.IO.IsolatedStorage; 1.将图片保存到独立存储空间 using (IsolatedStorageFi ...

  3. 调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题

    在运用Entity Framework调用存储过程的时候,遇到"调用EF的存储过程报"调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题 ...

  4. 第21章 DMA—直接存储区访问

    本章参考资料:<STM32F76xxx参考手册>DMA控制器章节. 学习本章时,配合<STM32F76xxx参考手册>DMA控制器章节一起阅读,效果会更佳,特别是涉及到寄存器说 ...

  5. 第21章 DMA—直接存储区访问—零死角玩转STM32-F429系列

    第21章     DMA—直接存储区访问 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  6. DMA—直接存储区访问

    本章参考资料:< STM32F4xx 中文参考手册> DMA 控制器章节.学习本章时,配合< STM32F4xx 中文参考手册> DMA 控制器章节一起阅读,效果会更佳,特别是 ...

  7. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [3] 首页 APP 接口开发方案 ② 读取缓存方式

    以静态缓存为例. 修改 file.php line:11 去掉 path 参数(方便),加上缓存时间参数: public function cacheData($k,$v = '',$cacheTim ...

  8. 转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

    内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放 ...

  9. WP8 独立存储 总结3(应用设置)

    •可在独立存储中使用ApplicationSettings对象•在独立存储中存储键/值对的Dictionary方式存储 •存储的对象将永久保存 在应用设置中保存数据 void saveString(s ...

随机推荐

  1. JAVA 文档注释,类的说明,HTML说明文档的生成

    有的时候,我们会写一些类,编译成.class文件,给别人使用,那么,别人不知道这个类有哪些方法,如何调用. 所以我们需要做一个类的说明文档. 可以采用在.java类里面进行注释,通过注释来生成类的说明 ...

  2. js实现的新闻列表垂直滚动实现详解

    js实现的新闻列表垂直滚动实现详解:新闻列表垂直滚动效果在大量的网站都有应用,有点自然是不言而喻的,首先由于网页的空间有限,使用滚动代码可以使用最小的空间提供更多的信息量,还有让网页有了动态的效果,更 ...

  3. JMeter中3种参数值的传递

    小伙伴们在使用JMeter的过程中,肯定会遇到参数值传递的问题,下面来和大家总结下,在使用JMeter做压力测试的时候,常见的3种参数值的传递是怎样的. (一)从CSV文件读取要批量输入的变量 假如我 ...

  4. 问答精华-IntelliJ IDEA快捷键大全

    这篇文章介绍了idea的默认快捷键http://www.jikexueyuan.com/blog/229.html 另外:老师将快捷键设置为eclipse的了,你需要在preference里面找到ke ...

  5. IE10修改select样式

    一般我们针对webkit内核的,都使用-webkit-appearance来控制一些表单元素. 但是IE10如何来控制呢? select::-ms-expand{display:none;}

  6. C# 中将多个空格替换成一个空格

    2013-04-17 15:36 C# 中如何将多个空格替换成一个空格? 1 myString = Regex.Replace(myString, @"\s+", " & ...

  7. 找不到方法"Boolean System.Threading.WaitHandle.WaitOne(TimeSpan)"的解决方案

    找不到方法"Boolean System.Threading.WaitHandle.WaitOne(TimeSpan)" http://www.microsoft.com/down ...

  8. Hadoop 2.6.0动态添加节点

    文章出自:http://my.oschina.net/leoleong/blog/477508 本文主要从基础准备,添加DataNode和添加NodeManager三个部分详细说明在Hadoop2.6 ...

  9. 初探appium之元素定位(1)

    无论是selenium还是appium,元素定位都是我们开始实现自动化面临的第一个问题.selenium还好,我们可以在浏览器的调试页面进行元素定位还是蛮方便的.那么appium怎么做呢? 我看到很多 ...

  10. Epic - Desirable Number

    A number is called 'desirable' if all thedigits are strictly ascending eg: 159 as 1<5<9. You k ...