Wpf 使用 Prism 實戰開發Day24

自定義詢問窗口

當需要關閉系統或進行刪除數據或進行其他操作的時候,需要詢問用戶是否要執行對應的操作。那么就需要一個彈窗來給用戶進行提示。

一.添加自定義詢問窗口視圖 (MsgView.xaml)

1.首先,添加一個自定義詢問窗口視圖 (MsgView.xaml)

<UserControl x:Class="MyToDo.Views.Dialog.MsgView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:MyToDo.Views.Dialog"xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"mc:Ignorable="d" Width="380" Height="220"><Grid><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition/><RowDefinition Height="auto"/></Grid.RowDefinitions><!--標題--><TextBlock Text="{Binding Title}" d:Text="溫馨提示" Padding="5" FontSize="14"/><!--內容--><TextBlock Text="{Binding Content}" d:Text="確認刪除該數據嗎?" Grid.Row="1" Padding="15,0" FontSize="14" VerticalAlignment="Center"/><!--底部按鈕--><StackPanel Grid.Row="2" Margin="10" Orientation="Horizontal" HorizontalAlignment="Right"><Button Content="取消" Margin="0,0,10,0" Style="{StaticResource MaterialDesignOutlinedButton}"Command="{Binding CancelCommand}"/><Button Content="確認" Command="{Binding SaveCommand}"/></StackPanel></Grid>
</UserControl>

2.視圖添加完成后,再添加對應的ViewModel,即對應的MsgViewModel 視圖邏輯處理類。

 public class MsgViewModel:BindableBase,IDialogHostAware{public MsgViewModel(){CancelCommand = new DelegateCommand(Cancel);SaveCommand = new DelegateCommand(Save);}private string title;public string Title{get { return title; }set { title = value; RaisePropertyChanged(); }}private string content;public string Content{get { return content; }set { content = value; RaisePropertyChanged(); }}public string DialogHostName { get; set; } = "RootDialog";//彈出的子窗口永遠賦在父窗口上面public DelegateCommand CancelCommand { get; set; }public DelegateCommand SaveCommand { get; set; }public void OnDialogOpend(IDialogParameters parameters){//接收視圖傳過來的標題和內容if (parameters.ContainsKey("Title")){Title = parameters.GetValue<string>("Title");}if (parameters.ContainsKey("Content")){Content = parameters.GetValue<string>("Content");}}private void Cancel(){if (DialogHost.IsDialogOpen(DialogHostName)) //是否是打開{DialogHost.Close(DialogHostName, new DialogResult(ButtonResult.No)); //關閉}}private void Save(){if (DialogHost.IsDialogOpen(DialogHostName)) //是否是打開{DialogParameters pairs = new DialogParameters(); //定義返回參數DialogHost.Close(DialogHostName, new DialogResult(ButtonResult.OK, pairs));}}}

3.彈窗視圖和對應的處理邏輯添加完畢后,最后一步還需要在App中進行注冊

 containerRegistry.RegisterForNavigation<MsgView,MsgViewModel>();

?二.使用自定義詢問窗口視圖

由于詢問窗口視圖是多地方復用,因此寫成一個擴展方法,供需要使用的地方進行重復調用。

1.添加擴展方法(Question)

 public static class DialogExtensions{/// <summary>/// 發布事件/// </summary>/// <param name="aggregator"></param>/// <param name="model"></param>public static void UpdateLoading(this IEventAggregator aggregator,UpdateModel model){aggregator.GetEvent<UpdateLoadingEvent>().Publish(model);}/// <summary>/// 訂閱事件/// </summary>/// <param name="aggregator"></param>/// <param name="model"></param>public static void Resgiter(this IEventAggregator aggregator,Action<UpdateModel> model){aggregator.GetEvent<UpdateLoadingEvent>().Subscribe(model);}/// <summary>/// 詢問窗口/// </summary>/// <param name="dialogHost">指定的會話主機</param>/// <param name="title">標題</param>/// <param name="content">內容</param>/// <param name="dialogHostName">會話主機名稱</param>/// <returns></returns>public static async Task<IDialogResult> Question(this IDialogHostService dialogHost,string title,string content,string dialogHostName= "RootDialog"){DialogParameters pairs = new DialogParameters();pairs.Add("Title", title);pairs.Add("Content", content);pairs.Add("DialogHostName", dialogHostName);var dialogResult=await dialogHost.ShowDialog("MsgView",pairs,dialogHostName);return dialogResult;}}

2.在需要的詢問地方進行使用

例如:在待辦事項處理邏輯中使用。首先,在構造函數中注入

在用戶刪除數據之前,先詢問

完整代碼

public class ToDoViewModel: NavigationViewModel{//由于NavigationViewModel 類構造中傳入了 IOC容器,所以當前類繼承的時候,需要把對應的參數傳通過Base傳過去就不會報錯了private readonly IDialogHostService dialogHost;public ToDoViewModel(IToDoService toDoService, IContainerProvider provider):base(provider){ToDoDtos = new ObservableCollection<ToDoDto>();ExecuteCommand = new DelegateCommand<string>(Execute);SelectedCommand = new DelegateCommand<ToDoDto>(Selected);DeleteCommand = new DelegateCommand<ToDoDto>(Delete);dialogHost = provider.Resolve<IDialogHostService>();this.toDoService = toDoService;}private bool isRightDrawerOpen;/// <summary>/// 右側編輯窗口是否展開/// </summary>public bool IsRightDrawerOpen{get { return isRightDrawerOpen; }set { isRightDrawerOpen = value; RaisePropertyChanged(); }}public DelegateCommand<string> ExecuteCommand{ get; private set; }public DelegateCommand<ToDoDto> SelectedCommand { get; private set; }public DelegateCommand<ToDoDto> DeleteCommand { get; private set; }private ObservableCollection<ToDoDto> toDoDtos;private readonly IToDoService toDoService;/// <summary>/// 創建數據的動態集合/// </summary>public ObservableCollection<ToDoDto> ToDoDtos{get { return toDoDtos; }set { toDoDtos = value;RaisePropertyChanged(); }}private ToDoDto currentDto;/// <summary>/// 編輯選中/新增對象/// </summary>public ToDoDto CurrentDto{get { return currentDto; }set { currentDto = value; RaisePropertyChanged(); }}private string search;/// <summary>/// 用戶輸入的搜索條件/// </summary>public string Search{get { return search; }set { search = value; RaisePropertyChanged(); }}private int? selectIndex = 0;/// <summary>/// 下拉列表狀態值/// </summary>public int? SelectIndex {get { return selectIndex; }set { selectIndex = value; RaisePropertyChanged(); }}/// <summary>/// 獲取數據/// </summary>async void GetDataAsync(){UpdateLoading(true); //發布消息,設置加載中的窗口//前端界面 0全部,1 待辦,2 已完成;數據庫實際值,0待辦,1已完成int? stastus=  SelectIndex == 0 ? null : SelectIndex == 2 ? 1 : 0;//添加查詢條件var todoResult=await toDoService.GetAllFilterAsync(new Shared.Parameters.ToDoParameter(){PageIndex = 0,PageSize = 100,Search = Search, //傳入搜索框查詢條件Status= stastus //下拉框值});if (todoResult.Status){toDoDtos.Clear();foreach (var item in todoResult.Result.Items){toDoDtos.Add(item);}}UpdateLoading(false); //發布消息,關閉加載中的窗口}/// <summary>/// 添加待辦/// </summary>/// <exception cref="NotImplementedException"></exception>private void Add(){CurrentDto = new ToDoDto();//添加時,初始化一個新對象IsRightDrawerOpen = true;}private async void Save(){//判斷數據是否為空if (string.IsNullOrWhiteSpace(CurrentDto.Title) || string.IsNullOrWhiteSpace(CurrentDto.Content)) return;UpdateLoading(true);try{if (CurrentDto.Id > 0) //Id 大于0,表示編輯。否則新增{var updateResult = await toDoService.UpdateAsync(CurrentDto);if (updateResult.Status) //更新成功{//查找到當前界面更新的那個條數據,把顯示的內容進行更新var todo = ToDoDtos.FirstOrDefault(t => t.Id == CurrentDto.Id);if (todo != null){todo.Title = CurrentDto.Title;todo.Content = CurrentDto.Content;todo.Status = CurrentDto.Status;}IsRightDrawerOpen = false; //關閉編輯窗口}}else{var addResult = await toDoService.AddAsync(CurrentDto);if (addResult.Status){if(addResult.Result != null){ToDoDtos.Add(addResult.Result); //把數據添加到界面的集合中IsRightDrawerOpen = false; //關閉新增窗口} }}}catch (Exception ex){await Console.Out.WriteLineAsync(ex.Message);}finally{UpdateLoading(false);}}private async void Delete(ToDoDto dto){var dialogResult= await dialogHost.Question("溫馨提示",$"確認要刪除待辦事項:{dto.Title}?");if (dialogResult.Result != ButtonResult.OK) return;var deleteResult=await toDoService.DeleteAsync(dto.Id);if (deleteResult.Status){//在當前數據集合中,找到當前已經刪除掉的數據,并移除掉var model= ToDoDtos.FirstOrDefault(t => t.Id.Equals(dto.Id));if(model != null) ToDoDtos.Remove(model);}}/// <summary>/// 根據不同的參數,處理不同的邏輯/// </summary>/// <param name="obj"></param>private void Execute(string obj){switch (obj){case "新增":Add();break;case "查詢":GetDataAsync();break;case "保存":Save();break;}}private async void Selected(ToDoDto obj){try{UpdateLoading(true);//進行數據查詢var todoResult = await toDoService.GetFirstOfDefaultAsync(obj.Id);if (todoResult.Status){//把拿到的結果,賦給一個當前選中的ToDoDtoCurrentDto = todoResult.Result;IsRightDrawerOpen = true;//打開窗口}}catch (Exception ex){await Console.Out.WriteLineAsync(ex.Message);}finally{UpdateLoading(false);}}//重寫導航加載數據的方法public override void OnNavigatedTo(NavigationContext navigationContext){base.OnNavigatedTo(navigationContext);GetDataAsync();}}

3.在視圖中使用。退出系統的時候,詢問用戶

namespace MyToDo.Views
{/// <summary>/// MainView.xaml 的交互邏輯/// </summary>public partial class MainView : Window{public MainView(IEventAggregator aggregator, IDialogHostService dialogHostService){InitializeComponent();//訂閱是否打開或關閉加載中的窗口aggregator.Resgiter(arg =>{DialogHost.IsOpen = arg.IsOpen;//設置打開窗口if (DialogHost.IsOpen){DialogHost.DialogContent = new ProgressView();}});//最小化btnMin.Click += (s, e) =>{this.WindowState = WindowState.Minimized;//窗口設置最小};//最大化btnMax.Click += (s, e) =>{//判斷窗口是否是最小化狀態if (this.WindowState == WindowState.Maximized){this.WindowState = WindowState.Normal; //改成正常狀態}else{this.WindowState = WindowState.Maximized;//最大化}};//關閉btnClose.Click += async (s, e) =>{var dialogResult= await  dialogHostService.Question("溫馨提示", "確認要退出系統嗎?");if (dialogResult.Result != Prism.Services.Dialogs.ButtonResult.OK) return;this.Close();};//鼠標拖動事件ColorZone.MouseMove += (s, e) =>{//如果鼠標在拖動if (e.LeftButton == MouseButtonState.Pressed){this.DragMove();//讓窗口移動}};//導航欄雙擊事件ColorZone.MouseDoubleClick += (s, e) =>{//雙擊時,如果是窗口是正常形態,就變成最大化if (this.WindowState == WindowState.Normal){this.WindowState = WindowState.Maximized;}else{this.WindowState = WindowState.Normal;//否則就變成正常的形態}};//菜單選擇事件menuBar.SelectionChanged += (s, e) =>{drawerHost.IsLeftDrawerOpen = false;};}}
}

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

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

相關文章

域內攻擊 ----->約束非約束委派攻擊

在域中&#xff0c;除了我們常見的橫向移動以外&#xff0c;還有很多攻擊&#xff0c;像什么kerberoasting&#xff0c;委派攻擊&#xff0c;NTLMrelay啊...... 還有很多&#xff08;暫時只知道這些&#xff09; 以前在一篇公眾號看到的一個笑話也薈萃了網安的一些攻擊手法&am…

vscode終端運行pnpm,yarn不成功問題

vscode終端運行pnpm&#xff0c;yarn不成功問題 1.問題描述2.解決辦法 1.問題描述 全局安裝了pnpm后&#xff0c;cmd窗口執行pnpm -v可以查看版本信息&#xff0c;在項目目錄可以執行操作&#xff0c;但是在vscode中無法執行并報錯 2.解決辦法 以管理員身份運行vscode打開vscod…

《拯救大學生課設不掛科第二期之Windows11下安裝VC6.0(VC++6.0)與跑通Hello World C語言程序教程》【官方筆記】

背景與目標人群&#xff1a; 大學第一次學C語言的時候&#xff0c;大部分老師會選擇VC6這個編輯器。 但由于很多人是新手&#xff0c;第一次上大學學C語言。 老師要求VC6.0&#xff08;VC6.0&#xff09;寫C語言跑程序可能很多人還是第一次接觸電腦。 需要安裝VC6這個編輯器…

深入理解ECMAScript:JavaScript的規范與實踐

引言 在當今的Web開發領域&#xff0c;JavaScript幾乎無處不在。它不僅在客戶端編程中占據主導地位&#xff0c;而且在服務器端&#xff08;Node.js&#xff09;和移動應用開發中也越來越受歡迎。然而&#xff0c;JavaScript的核心并非由單一的公司或組織控制&#xff0c;而是…

初識Java--開啟我的Java學習之旅

目錄 一、JAVA語言概述二、JAVA語言的重要性2.1語言使用廣泛程度2.2工作領域2.3在校招崗位的需求2.4 java語言發展簡史2.5Java語言特性 三、初識java的main方法四、運行java程序五、【面試題】JDK、JRE、JVM之間的關系&#xff1f; 一、JAVA語言概述 Java是一種優秀的程序設計…

【Apache Doris】周FAQ集錦:第 4 期

【Apache Doris】周FAQ集錦&#xff1a;第 4 期 SQL問題數據操作問題運維常見問題其它問題關于社區 歡迎查閱本周的 Apache Doris 社區 FAQ 欄目&#xff01; 在這個欄目中&#xff0c;每周將篩選社區反饋的熱門問題和話題&#xff0c;重點回答并進行深入探討。旨在為廣大用戶和…

Redis常見數據類型(6)-set, zset

目錄 Set 命令小結 內部編碼 使用場景 用戶畫像 其它 Zset有序集合 普通指令 zadd zcard zcount zrange zrevrange ?編輯 zrangebyscore zpopmax/zpopmin bzpopmax/bzpopmin zrank/zrevrank zscore zrem zremrangebyrank zremrangebyscore Set 命令小結 …

鏈棧的存儲

單向鏈表在棧中的存儲 typedef struct StackNode {SElemType data;struct StackNode* next; }StackNode, *LinkStack; LinkStack S; //鏈棧初始化 void InitStack(LinkStack& S) {S NULL;return OK; } //判斷鏈棧是否為空 Status StackEmpty(LinkStack S) {if (S NU…

將具有傳統IP的設計遷移到Vivado設計套件

將具有傳統IP的設計遷移到Vivado設計套件 概述 AMD Vivado?設計套件允許您從CORE Generator?工具遷移IP設計。你可以 還可以將IP遷移到Vivado Design Suite的最新版本。 重要&#xff01;Vivado集成開發環境&#xff08;IDE&#xff09;要求IP、實例化和 端口名都是小寫的。將…

Spring 模擬管理Web應用程序

MVC&#xff1a;Model View Controller 1&#xff09;controller&#xff1a;控制層&#xff08;Servlet是運行服務器端&#xff0c;處理請求響應java語言編寫技術&#xff09; 2&#xff09;service&#xff1a;業務層&#xff08;事務&#xff0c;異常&#xff09; 3&#xf…

視頻號小店的保證金是多少錢?2024最新收費標準,一篇了解!

哈嘍~我是電商月月 現實社會&#xff0c;干什么都需要交錢&#xff0c;就連上班&#xff0c;路費也得掏錢 想要入駐視頻號小店&#xff0c;在視頻號里賣貨賺錢&#xff0c;就要繳納類目保證金 那到底要繳多少錢呢&#xff1f; 今天&#xff0c;月月就把最新的收費標準分享給…

輕松拿捏C語言——【字符串函數】的使用及模擬實現

&#x1f970;歡迎關注 輕松拿捏C語言系列&#xff0c;來和 小哇 一起進步&#xff01;? &#x1f389;創作不易&#xff0c;請多多支持&#x1f389; &#x1f308;感謝大家的閱讀、點贊、收藏和關注&#x1f495; &#x1f339;如有問題&#xff0c;歡迎指正 感謝 目錄 一、…

mysql 拼接兩個字段的值 使用CONCAT的函數

CONCAT()函數拼接兩個不用字段的值&#xff0c;最后在一個字段里面顯示出來&#xff0c;具體實例如下&#xff1a; 下面這個案例就行把SSSHENGBH、SSSBH、SSXBH、SSXZBH字段值拼接到一個字段里面進行顯示 select CONCAT(SSSHENGBH,SSSBH,SSXBH,SSXZBH) FROM BLT_JBXXJLB

3D 生成重建013-ProlificDreamer將SDS拓展到VSD算法進行高質量的3D生成

3D 生成重建013-ProlificDreamer將SDS拓展到VSD算法進行高質量的3D生成 文章目錄 0論文工作1論文方法2效果 0論文工作 **分數蒸餾采樣&#xff08;SDS&#xff09;**通過提取預先訓練好的大規模文本到圖像擴散模型&#xff0c;在文本到3d生成方面顯示出了巨大的前景&#xff0…

Windows VS2022 C語言使用 sqlite3.dll 訪問 SQLite數據庫

今天接到一個學生C語言訪問SQLite數據庫的的需求: 第一步,SQLite Download Page下載 sqlite3.dll 庫 下載解壓,發現只有兩個文件: 于是使用x64 Native Tools Command Prompt 終端 生成 sqlite3.lib 和 sqlite3.exp文件 LIB -def:sqlite3.def -out:sqlite3.lib -machin…

廣告圈策劃大師課:活動策劃到品牌企劃的深度解析

對于剛接觸營銷策劃的新人來說&#xff0c;在這個知識密集型行業里生存&#xff0c;要學習非常多各種意思相近的概念&#xff0c;常常讓人感到頭疼&#xff0c;難以區分。 這里對這些策劃概念進行深入解析&#xff0c;幫助您輕松理清各自的含義和區別。 1. 活動策劃&#xff…

C++ 字符串處理-將字符串轉成大寫或小寫

1. 關鍵詞2. strutil.h3. strutil.cpp4. 測試代碼5. 運行結果6. 源碼地址 1. 關鍵詞 C 字符串處理 將字符串轉成大寫或小寫 跨平臺 2. strutil.h #include <string> namespace cutl {/*** brief Convert a string to upper case.** param str the string to be conve…

微信小程序自定義頭部

1.在對應界面的json文件&#xff0c;將navigationStyle屬性設置為“custom” "navigationStyle":"custom" 2. 狀態欄的高度可以通過 wx.getSystemInfo() 獲取。 膠囊按鈕的信息可以通過 wx.getMenuButtonBoundingClientRect() 獲取。 導航欄高度狀態欄…

截圖工具PixPin(比Snipaste更強大)

PixPin官網鏈接&#xff1a;https://pixpinapp.com/ 最近新出的一款截圖工具PixPin&#xff0c;比Snipaste功能多一些。在Snipaste功能基礎上&#xff0c;還支持長截圖&#xff0c;截動圖&#xff0c;文本識別。