WPF學習之Prism(二)

前言

學習一下Prism。

1.Prism

Prism框架提供了一套豐富的工具、類和模塊,幫助開發人員實現以下功能:

  • 模塊化:Prism框架支持將應用程序拆分為多個模塊,每個模塊具有自己的功能和視圖。這種模塊化的設計使得應用程序更加靈活和可擴展。
  • 導航:Prism框架提供了導航功能,可以方便地在不同的視圖之間進行導航和交互。開發人員可以定義導航路徑和參數,以及處理導航事件。
  • 依賴注入:Prism框架內置了一個輕量級的依賴注入容器,可以幫助開發人員管理和解決組件之間的依賴關系。這樣可以提高代碼的可測試性和可維護性。
  • 事件聚合器:Prism框架提供了一個事件聚合器,可以幫助不同模塊之間進行解耦和通信。開發人員可以通過發布和訂閱事件來實現模塊之間的交互。
  • 命令綁定:Prism框架支持命令綁定,可以將用戶操作和后臺邏輯進行綁定。這樣可以更好地分離用戶界面和業務邏輯。
  • 可測試性:Prism框架的設計考慮了應用程序的可測試性,提供了一些工具和模式,幫助開發人員編寫可測試的代碼。

1.1創建WPF

創建WPF程序,我是基于net8框架創建。

image-20240326213002184

安裝包

Prism.DryIoc

image-20240326213043243

修改App.xaml

繼承PrismApplication并實現CreateShell(設置啟動頁)、RegisterTypes(注冊服務)

因為即設置了啟動頁,也設置了StartupUri,所以彈出了倆個窗體。

image-20240326213846042

1.2創建Prism

打開vs,我的是vs2022,管理擴展

image-20240326214451835

查找Prism,安裝 Prism Template Pack

image-20240326214530471

安裝完后,關閉所有vs,再打開就會自動修改vs2022的配置,等待修改完畢即可

image-20240326214636635

創建WPF Prism Full項目

image-20240326214744071

選擇DryIoc

image-20240326214957745

創建成功

image-20240326215026523

2.Prism區域

2.1實現區域切換

創建ViewModels、Views文件夾內,注意名稱,容器就是根據命名空間找到對應的類。

新建三個用戶控件,并在App注入服務。

image-20240326223952386

需要修改MainWindow的命名空間,加上Views,要不容器無法找到,算是一個小坑。

MainWindow加上幾個按鈕和ContentControl用于區域切換。

button加上參數,用于后臺命令根據名稱切換界面。

prism:ViewModelLocator.AutoWireViewModel="True"。

image-20240326224304070

MainWindowViewModel實現BindableBase。

實現顯示內容命令(DelegateCommand),根據前臺傳入的參數顯示區域。

image-20240326224437753

2.2解耦優化

注入IRegionManager(區域管理),通過IRegionManager去實例化用戶控件。

image-20240326225710679

App重載一下RegisterForNavigation。

如果不想使用別名需要全名,這里使用別名。

image-20240326225901070

3.Prism模塊化

3.1引用模塊

創建WPF程序模塊A和模塊B

image-20240327213111948

image-20240327213219150

刪除WPF程序自帶的一些文件。

image-20240327213316334

然后把Peng.MoudleA和Peng.MoudleB輸出類型改為類庫。

image-20240327215255938

為什么創建WPF程序而不是類庫?

因為類庫不能添加WPF窗口、用戶控件等文件,項目需要加載模塊的窗口、用戶控件等。

image-20240327213440234

ModuleA、ModuleB都引用Prism.DryIoc。

  <ItemGroup><PackageReference Include="Prism.DryIoc" Version="8.1.97" /></ItemGroup>

image-20240327213901228

實現IModule,把MoudleA和MoudleB注入到IOC容器中。

image-20240327224507716

主程序引入MoudleA和MoudleB,并且改變命令參數為MoudleAUC、MoudleBUC,此名稱對應模塊中用戶控件名稱。

image-20240327215936789

在主程序添加MoudleA和MoudleB。

image-20240327220104855

3.2動態加載

添加Modules文件夾,并且把生成后的MoudleA和MoudleB移到Modules文件夾下。

image-20240327220447281

選擇Peng.MoudleA.dll和Peng.MoudleBdll修改屬性始終復制。

image-20240327220531072

主程序不用引入Peng.MoudleA和Peng.MoudleB了,會動態加載Modules目錄下的dll。

image-20240327220752547

4.導航

4.1傳參

ViewModelLocator.AutoWireViewModel="True"可以通過命名的形式讓控件找到對應的視圖,但是一旦名字寫錯就容易找不到,所以一般不建議這么使用,可以注入的時候指定控件和視圖。

image-20240327224834978

通過添加NavigationParameters字典傳參。

image-20240327225043595

ModuleAUCViewModel需要實現INavigationAware。

通過判斷是否存在Key獲取參數值,然后雙向綁定顯示界面。

image-20240327225129796

重新生成后,記得替換Modules目錄下的dll。

image-20240327225919401

4.2導航后退

增加后退按鈕,綁定后退命令。

image-20240327230002940

實現后退命令。

第一次加載的時候Journal為null,所以需要判斷非null。

image-20240327230055089

傳參數的時候需要添加導航記錄。

image-20240327230119109

實現IConfirmNavigationRequest,這里不需要INavigationAware,因為IConfirmNavigationRequest繼承了INavigationAware

image-20240327230213424

5.Prism對話框

新建Peng.MoudleC用于對話框服務。

簡單寫一下界面,一個Title,一個顯示獲取的參數,還有倆個按鈕。

ModuleCUCViewModel實現BindableBase、IDialogAware。

BindableBase用于和界面綁定。

IDialogAware是對話框服務。

image-20240328153455116

實現IDialogAware幾個方法。

RequestClose是返回對話框狀態,在確定和取消命令的時候返回結果。

在OnDialogOpened時獲取傳入的參數。

在Confirm時返回參數。

image-20240328153730624

最后顯示注入對話框服務。

image-20240328154012624

主界面添加一個按鈕和一個文本框用于打開對話框和顯示對話框傳入的參數。

添加ShowDialogCmd顯示對話框命令。

添加DialogService對話框服務。

在DialogService.ShowDialog回調函數中獲取對話框返回結果。

image-20240328154141212

重新生成后記得改Peng.MoudleC.dll屬性為始終復制。

image-20240328154455855

6.發布訂閱

實現PubSubEvent,T是訂閱方法的參數類型。

image-20240328214601864

代碼比較簡單,簡單贅述一下。

主界面添加三個按鈕:發布、訂閱、取消訂閱,綁定三個命令。

IEventAggregator是發布訂閱的服務,默認已經注入,可以通過構造函數方式獲取即可。

Publish:發布事件。

Subscribe:訂閱事件。

CancelSub:取消訂閱。

image-20240328214342252

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896406.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【EB-03】 AUTOSAR builder與EB RTE集成

AUTOSAR builder與EB RTE集成 1. Import Arxml files to Tresos2. Run MultiTask Script3. Add Components3.1 Run EcuExtractCreator Script4. Mapping Component to Partitions5. Event Mapping/Runnables Mapping to Tasks6. Port Connect7. Run SvcAs_Trigger Script8. Ver…

算法教程:香檳塔問題

香檳塔問題 問題描述 我們將玻璃杯堆成金字塔狀,第一排有 1 個玻璃杯,第二排有 2 個玻璃杯,依此類推,直到第 100 排。每個玻璃杯裝一杯香檳。 然后,將一些香檳倒入最上面的第一個玻璃杯中。當最上面的玻璃杯裝滿時,任何多余的液體都會均勻地落到它左右兩側的玻璃杯上。當…

FastJSON 默認行為:JSON.toJSONString 忽略 null 字段

完整的 FakeRegistrationController 代碼&#xff0c;這讓我可以全面分析后端邏輯&#xff0c;特別是為什么空的字段&#xff08;如 compareDate&#xff09;不返回給前端。我將詳細分析代碼的每個接口&#xff0c;尤其是與 list 請求和字段返回相關的部分&#xff0c;并解釋原…

大模型基礎概念之神經網絡寬度

在大模型中,神經網絡寬度是提升模型容量的核心手段之一,與深度、數據規模共同構成性能的三大支柱。合理增加寬度可顯著增強模型表達能力,但需結合正則化、硬件優化和結構設計進行平衡。未來趨勢可能包括動態寬度調整、稀疏化寬度設計(如MoE)以及更高效寬度-深度復合縮放策…

在Linux環境下利用MTCNN進行人臉檢測(基于ncnn架構)

概述 本文將詳細介紹如何在Linux環境下部署MTCNN模型進行人臉檢測&#xff0c;并使用NCNN框架進行推理。 1. CMake的安裝與配置 下載CMake源碼 前往CMake官網下載&#xff0c;找到適合您系統的最新版本tar.gz文件鏈接&#xff0c;或者直接通過wget下載&#xff1a;CMake官方…

算法day1 dfs搜索2題

一 火星人 拿到這種類似于排序的&#xff0c;這個就好比如我們之前學習dfs基礎的時候里面的指數型枚舉 指數型枚舉數據與數據之間沒有任何枚舉&#xff0c;就比如選這個數字與不選組合型枚舉數據與數據之間有聯系&#xff0c;下一個數字不可以給上一個數字排列型枚舉數據與數…

CC攻擊防御策略全解析:技術實現與代碼示例

CC攻擊&#xff08;Challenge Collapsar&#xff09;是一種以消耗服務器資源為目標的分布式拒絕服務攻擊&#xff08;DDoS&#xff09;&#xff0c;其特點在于攻擊流量偽裝成合法請求&#xff0c;難以通過傳統防火墻完全防御。本文將從技術實現角度詳細解析CC攻擊的防御策略&am…

(九)axios的使用

1、axios 的基本使用 1.1、簡介 在 Web 開發的演進歷程中&#xff0c;數據請求方式的變革至關重要。回溯早期&#xff0c;舊瀏覽器在向服務器請求數據時&#xff0c;存在嚴重弊端。由于返回的是整個頁面數據&#xff0c;每次請求都會導致頁面強制刷新&#xff0c;這不僅極大地…

【MySQL篇】數據庫基礎

目錄 1&#xff0c;什么是數據庫&#xff1f; 2&#xff0c;主流數據庫 3&#xff0c;MySQL介紹 1&#xff0c;MySQL架構 2&#xff0c;SQL分類 3&#xff0c;MySQL存儲引擎 1&#xff0c;什么是數據庫&#xff1f; 數據庫&#xff08;Database&#xff0c;簡稱DB&#xf…

網絡安全事件研判

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取網絡安全全套資料&#xff0c;資料在手&#xff0c;漲薪更快 研判&#xff08;入侵檢測&#xff09; 研判我理解為人工層面對入侵檢測事件進行再分析&#xff0c;即借助已有的設備告警根據經驗判斷是否為真實action 研判工作…

python整理文件下

我們使用 os.path.join() 函數拼接出文件要移動的目標地址。 并使用 os.path.exists() 函數配合 not 關鍵字找到未創建的文件夾。 這節課&#xff0c;我們會先創建文件夾&#xff0c;然后再移動文件到目標文件夾。如果文件夾不存在&#xff0c;我們需要先創建文件夾&#xff…

hackmyvm-buster

題目地址 信息收集 主機發現 ┌──(root?kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…

FS800DTU聯動OneNET平臺數據可視化View

目錄 1 前言 2 環境搭建 2.1 硬件準備 2.2 軟件環境 2.3 硬件連接 3 注冊OneNET云平臺并建立物模型 3.1 參數獲取 3.2 連接OneNET 3.3上報數據 4 數據可視化View 4.1 用戶信息獲取 4.2 啟用數據可視化View 4.3 創建項目 4.4 編輯項目 4.5 新增數據源 4.6 數據過濾器配置 4.6 項…

Dockerfile 中的 COPY 語句:作用與使用詳解

在 Docker 的構建過程中&#xff0c;Dockerfile 是一個核心文件&#xff0c;它定義了鏡像的構建步驟和內容。其中&#xff0c;COPY 語句是一個非常重要的指令&#xff0c;用于將文件或目錄從構建上下文&#xff08;通常是 Dockerfile 所在的目錄及其子目錄&#xff09;復制到容…

大白話Vuex 核心概念(state、mutations、actions)的使用案例與原理

大白話Vuex 核心概念&#xff08;state、mutations、actions&#xff09;的使用案例與原理 Vuex是Vue.js應用程序中專門用來管理狀態的工具&#xff0c;就好像是一個大管家&#xff0c;幫你把項目里一些重要的數據和操作管理得井井有條。下面用大白話結合案例來介紹Vuex核心概…

機器學習介紹與數據集

一、機器學習介紹與定義 1.1 機器學習定義 機器學習&#xff08;Machine Learning&#xff09;是讓計算機從數據中自動學習規律&#xff0c;并依據這些規律對未來數據進行預測的技術。它涵蓋聚類、分類、決策樹、貝葉斯、神經網絡、深度學習&#xff08;Deep Learning&#xf…

大模型訓練——pycharm連接實驗室服務器

一、引言 我們在運行或者復現大佬論文代碼的時候&#xff0c;筆記本的算力不夠&#xff0c;需要使用實驗室的服務器進行運行。可以直接在服務器的終端上執行&#xff0c;但是這樣的話代碼調試就不方便。而我們可以使用 pycharm 連接到服務器&#xff0c;既方便了代碼調試&…

【Linux】進程優先級 | 進程調度(三)

目錄 前言&#xff1a; 一、進程優先級&#xff1a; 1.通過nice值修改優先級&#xff1a; 二、進程切換&#xff1a; 三、上下文數據 四、Linux真實調度算法&#xff1a; 五、bitmap位圖&#xff1a; 六、命令總結&#xff1a; 總結&#xff1a; 前言&#xff1a; 我…

【redis】數據類型之hyperloglog

Redis的HyperLogLog&#xff08;HLL&#xff09;是一種高效的概率數據結構&#xff0c;也是一種基于字符串的數據結構&#xff0c;用于估計大數據集的唯一元素數量&#xff08;基數統計&#xff09;。它通過極低的內存占用&#xff08;約 12KB&#xff09;實現接近線性的時間復…

【C語言】第八期——指針、二維數組與字符串

目錄 1 初始指針 2 獲取變量的地址 3 定義指針變量、取地址、取值 3.1 定義指針變量 3.2 取地址、取值 4 對指針變量進行讀寫操作 5 指針變量作為函數參數 6 數組與指針 6.1 指針元素指向數組 6.2 指針加減運算&#xff08;了解&#xff09; 6.2.1 指針加減具體數字…