WinUI(WindowsAppSDK)使用LiteDB做個女演員圖鑒

来源:https://www.cnblogs.com/GreenShade/archive/2022/04/18/16161875.html
-Advertisement-
Play Games

為什麼選擇LiteDB 之前做uwp的時候有做過一個植物圖鑒,當時圖片使用的是線上圖片,所以圖片很多也並沒有什麼體驗上的差別,但是直到有一天別人的網站掛掉了,圖片訪問不到了,當時想訪問不到也沒啥,反正圖片都被我爬到本地了,於是就把圖片統統放在Assets目錄里,把url改了下就啟動了。 可是事實很尷 ...


為什麼選擇LiteDB

之前做uwp的時候有做過一個植物圖鑒,當時圖片使用的是線上圖片,所以圖片很多也並沒有什麼體驗上的差別,但是直到有一天別人的網站掛掉了,圖片訪問不到了,當時想訪問不到也沒啥,反正圖片都被我爬到本地了,於是就把圖片統統放在Assets目錄里,把url改了下就啟動了。

可是事實很尷尬,也不知道uwp是怎麼訪問Assets目錄的文件,總之啟動很卡,仿佛每次啟動都會遍歷一遍Assets的文件一樣,所以我天真的感覺改個目錄就行的方式不行了,PS(當時使用的是sqlite加ef存儲的數據),顯然舊方法不行就要想新方法了。

查了下文檔,sqlite也能存儲文件,為什麼我沒選擇繼續用sqlite呢?主要是因為ef的最新版本不支持uwp了,舊版本我也不想用了,剛好在很久的時候也讀到了h大佬的一篇講LiteDB的文章,於是腦子裡就出現了LiteDB這個選項。

強烈建議先看H佬的文章

h82258652 【UWP】使用 LiteDB 存儲數據

另外一點平時公司使用的資料庫也是MongoDB,在我看了LiteDB的api之後,發現它的風格和MongoDB的api風格很像,剛好使用起來也比較方便。廢話少說,先來張圖鑒圖片看看效果。
WinUI-liteDB

demo源碼地址-WinUI.UseLiteDB

WinUI(WindowsAppSDK)使用LiteDB的上手體驗

首先我們先創建一個WinUI(WindowsAppSDK)的項目,然後安裝名稱為LiteDB的nuget包,如下圖。
create-project

項目本身沒什麼特別的,主要是採用CommunityToolkit控制項庫里的AdaptiveGridView控制項結合MVVM進行數據的載入展示。

AdaptiveGridView綁定ViewModel里的屬性,屬性通過CommunityToolkit提供的增量載入集合IncrementalLoadingCollection進行服務的綁定,主要邏輯在PersonalInfoSource實現。
img

通過針對LiteDB數據操作的封裝,我們就可以在PersonalInfoSource服務里調用IPersonalInfoRepository倉儲介面,對應的實現就是封裝了LiteDB的增刪改查,包含圖片文件的存儲。
repo-data

主要涉及到LiteDatabase類的GetCollection方法,不同的Collection我們可以認為是不同的表,針對某個Collection的插入讀取就相當於針對單表的插入和讀取。

圖片文件的存儲涉及到GetStorage方法,這個我們可以根據需要命名,如上圖我們可以通過Upload方法將圖片存儲到資料庫文件。

圖上的方法把數據存儲成功了,我們讀取的時候操作也類似,通過Collection將數據讀出,然後針對圖片文件讀取成流,放到對象里。

   public Task<IReadOnlyCollection<PersonalInfo>> GetListAsync(
            int pageIndex, int pageSize, CancellationToken cancellationToken = default)
        {
            var query = _liteDatabase.GetCollection<PersonalInfo>().Query();

            var list = query
                .OrderByDescending(p => p.Name)
                .Skip((pageIndex) * pageSize)
                .Limit(pageSize)
                .ToList();


            if (list != null && list.Count > 0)
            {
                var fs = _liteDatabase.GetStorage<string>("dataFiles", "dataChunks");

                foreach (var item in list)
                {
                    if (fs.Exists($"$/Data/{item.AvatarName}"))
                    {
                        LiteFileInfo<string> file = fs.FindById($"$/Data/{item.AvatarName}");

                        Stream stream = new MemoryStream();

                        fs.Download(file.Id, stream);

                        stream.Seek(0, SeekOrigin.Begin);

                        item.AvatarStream = stream;
                    }
                }
            }

            return Task.FromResult((IReadOnlyCollection<PersonalInfo>)list);
        }

流的讀取主要涉及到Download方法,針對流可以執行stream.Seek(0, SeekOrigin.Begin);

這部分的代碼我參考了一個uwp的demo地址如下:

UWP-LiteDB-Sample

現在我們獲取到了列表信息和圖片流,只要在展示的時候處理下,就可以綁定到AdaptiveGridView,將流轉換成BitmapImage就可以展示到界面上了。
stream2image

看到這裡整體的使用過程就算是結束了,感覺上和uwp使用沒什麼區別,畢竟WinUI(WindowsAppSDK)算是繼承了uwp的衣缽。

再次提供demo源碼地址連接,點擊這裡就行

XAML代碼如圖
img

WinUI(WindowsAppSDK)可以期待些什麼

demo我使用的是WinUI 1.0的版本,目前1.1版本正在預覽,添加很多新特性,如下圖:

img

整體可以期待的是winui(WindowsAppSDK)替代uwp的那一天吧,不過目前看來uwp還是可以很長命的,因為winui(WindowsAppSDK)目前好像還不支持xbox,而且c# .net版本的winui(WindowsAppSDK)目前啟動速度也是有點慢。目前如果開發的應用不複雜,替代wpf還是可以的。

推薦的項目地址如下:

WindowsAppSDK

WindowsCommunityToolkit

LiteDB - A .NET NoSQL Document Store in a single data file


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

-Advertisement-
Play Games
更多相關文章
  • 車牌識別在高速公路中有著廣泛的應用,比如我們常見的電子收費(ETC)系統和交通違章車輛的檢測,除此之外像小區或地下 車庫門禁也會用到,基本上凡是需要對車輛進行身份檢測的地方都會用到。 簡介 車牌識別系統(Vehicle License Plate Recognition)是電腦視頻圖像識別技術在車 ...
  • Pillow 圖片處理模塊 Pillow是Python第三方庫,Python2中有一個叫PIL(Python Imaging Library)的標準庫,但不支持Python3,所以一些志願者在PIL的基礎上創建了Pillow,支持Python3。Pillow支持動態圖像編輯。 安裝Pillow pi ...
  • 背景 外媒The Register報道,甲骨文稽查企業用戶,近期開始將把過去看管較鬆散的Java授權加入。 甲骨文針對標準版Java(Java SE)有2種商業授權。2019年4月甲骨文宣佈Java SE用戶需要付費訂閱,才能取得授權及更新,包括Java SE 7、8或11、12。但到同年9月該公司 ...
  • 一個比特(bit)可以是0,或者是1,8個比特(bit),組成一個位元組(byte)。全為0時代表數字0,全為1時代表數字255。 一個位元組可以表示256個數字,兩個位元組可以表示65536個數字。 更多的位元組,可以有更多的組合,就可以表示更大的數值範圍。 整數可以這麼存,那字元呢?一堆二進位的0和1, ...
  • 前言 本文將記錄學習下如何通過 Python 腳本實現 WIFI 密碼的暴力破解,從而實現免費蹭網。 無圖形界面 先來看看沒有圖形界面版的爆破腳本。 WIFI爆破 Python學習交流Q群:906715085#### import pywifi from pywifi import const im ...
  • 1.為什麼要用const const本質上其實不僅僅是對變數的一個限定符,更是對程式員的一個限定符,它提醒了程式員,通過const限定的變數的值是不應該被更改的,並且當編譯器得知變數或者表達式的求值結果是恆定的時候,編譯器也可以在編譯期大展拳腳,為我們做出一些編譯期優化,進而提高我們的程式在運行時的 ...
  • 介紹 Dapr簡化了雲原生開發,讓開發可以把焦點放在應用的業務邏輯上,從而讓代碼簡單、可移植,那作為一個.Net開發者,我們也希望項目可以快速用上dapr,那究竟應該如何做呢? Dapr提出了Sidecar(邊車)的概念,在啟動項目時再額外啟動一個Sidecar, 通過Sidecar可以解決進程間通 ...
  • 很多.net項目在開發的時候,.net core還沒有出現或者還麽有成熟,如今.netcore3.1已經出現,其技術風險已經比較低,今天對項目如何遷移到.net core做一個簡單的梳理,瑾做參考。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...