Xuan.UWP.Framework(2)

来源:http://www.cnblogs.com/xuanstudio/archive/2017/10/27/7743366.html
-Advertisement-
Play Games

上一章主要介紹了Xuan.UWP.Framework.ImageLib的基本用法,這一章具體來看些Xuan.UWP.Framework.ImageLib的使用。 一、首先看下Xuan.UWP.Framework.ImageLib中最主要的class之一的ImageLoader。 可以看到ImageL ...


  上一章主要介紹了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 > 0) {
                    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 > 0) {
                    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 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是今天幫 "檸檬" 分析一個 "AsyncLocal相關的問題" 時發現的. 試想這個代碼輸出的值是多少? 答案是123. 為什麼修改了 的值卻無效呢? 這要從AsyncLocal的運作機制說起. 首先這是 "AsyncLocal的源代碼" : 獲取和設置值用的是 和`ExecutionConte ...
  • WCF系統內置綁定列表 編碼格式 一個綁定,適用於與符合 WS-Basic Profile的Web服務(例如基於 ASP.NET Web 服務(ASMX)的服務)進行的通信。 此綁定使用HTTP作為傳輸協議,並使用文本/XML作為預設的消息編碼 Text, MTOM WCF各系統綁定所支持的功能 ...
  • 在 "上一篇" 我們對CoreCLR中的JIT有了一個基礎的瞭解, 這一篇我們將更詳細分析JIT的實現. JIT的實現代碼主要在 "https://github.com/dotnet/coreclr/tree/master/src/jit" 下, 要對一個的函數的JIT過程進行詳細分析, 最好的辦法 ...
  • ASP.NET Core 2.0 開源Git HTTP Server,實現類似 GitHub、GitLab。 GitHub:https://github.com/linezero/GitServer 設置 需要先安裝Git,並確保git 命令可以執行,GitPath 可以是 git 的絕對路徑。 目 ...
  • 一、關於分部視圖(Partial View) Partial View是可以應用在View中的,編寫一次,在其他View中可以被反覆使用。通常都是放在"Views——Shared"文件夾中。 1. 創建Partial View:右鍵"Views——Shared"文件夾添加分部視圖。 2. 使用Par ...
  • 最近有不少網友提起await和async,呵呵,C# 5引進的語法糖。 這個語法糖還真不好吃,能繞倒一堆初學的朋友,在網上也有很多網友關於這塊知識點的爭論,有對有錯,今天在這裡把這個誤區好好講講。 在await(C# 參考)這樣寫道: “await 運算符應用於非同步方法中的任務,在方法的執行中插入掛 ...
  • 一、概述 1. 程式集是.NET應用程式的部署單元 程式集是.NET應用程式的部署單元。 程式集是自我描述的安裝單元,由一個或多個文件組成。 通常擴展名是EXE或DLL的.NET可執行程式稱為程式集。 .NET程式集包含元數據。 2. 程式集的特性 程式集是自我描述的。 版本的相互依賴性在程式集的清 ...
  • 多線程使用共用變數,就會涉及到一個線程同步的問題。那如何解決呢? 1) 重構程式,移除多線程的共用變數,讓一個線程只訪問一個自有變數 2) 使用原子操作,一個操作只占用一個量子時間,一次完成,只有噹噹前操作完成之後,其他線程才能進行操作。這樣可以避免使用獨占鎖,避免死鎖。... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...