【WPF.NET開發】WPF中的對話框

目錄

1、消息框

2、通用對話框

3、自定義對話框

實現對話框

4、打開對話框的 UI 元素

4.1 菜單項

4.2 按鈕

5、返回結果

5.1 模式對話框

5.2 處理響應

5.3 非模式對話框


Windows Presentation Foundation (WPF) 為你提供了自行設計對話框的方法。 對話框是窗口,但具有特定的意圖和用戶體驗。 本文討論對話框的工作原理以及可以創建和使用的對話框類型。 對話框用于:

  • 向用戶顯示特定信息。
  • 從用戶處收集信息。
  • 同時顯示并收集信息。
  • 顯示操作系統提示,例如打印窗口。
  • 選擇文件或文件夾。

這些類型的窗口稱為對話框。 對話框可以通過兩種方式顯示:模式和非模式。

向用戶顯示模式對話框是一種技術,應用程序使用該技術中斷其正在執行的操作,直到用戶關閉對話框。 這通常以提示或警報的形式出現。 在關閉對話框之前,無法與應用程序中的其他窗口進行交互。?模式對話框關閉后,應用程序將繼續運行。 最常見的對話框用于顯示打開文件或保存文件提示、顯示打印機對話框或向用戶發送一些狀態消息。

非模式對話框打開時不會阻止用戶激活其他窗口。 例如,如果用戶想要在文檔中查找特定單詞的匹配項,主窗口通常會打開一個對話框,詢問用戶要查找什么單詞。 由于應用程序不想阻止用戶編輯文檔,因此該對話框不必為模式對話框。 非模式對話框至少提供“關閉”按鈕來關閉對話框。 可能還會提供其他按鈕來運行特定功能,例如提供“查找下一個”按鈕以在單詞搜索中查找下一個單詞。

你可以使用 WPF 創建多種類型的對話框,例如消息框、通用對話框和自定義對話框。 本文將討論每種對話框,
對話框示例提供了匹配示例。

1、消息框

消息框是可以用來顯示文本信息并使用戶可以使用按鈕做出決定的對話框。 下圖顯示了一個消息框,框中詢問問題并為用戶提供三個按鈕來回答問題。

word-processor-dialog.png?view=netdesktop-8.0

要創建消息框,可以使用MessageBox?
類。?
MessageBox?允許你配置消息框文本、標題、圖標和按鈕。

2、通用對話框

Windows 實現了所有應用程序通用的不同類型的可重用對話框,其中包括用于選擇文件和打印的對話框。

由于這些對話框是由操作系統提供的,因此它們在操作系統上運行的所有應用程序之間共享。 這些對話框提供一致的用戶體驗,被稱為通用對話框。 當用戶在一個應用程序中使用通用對話框時,他們不需要學習如何在其他應用程序中使用該對話框。

WPF 封裝了“打開文件”、“保存文件”、“打開文件夾”和“打印”通用對話框,并將它們公開為托管類,供你使用。

open-file-dialog-box.png?view=netdesktop-8.0

3、自定義對話框

雖然通用對話框很有用,并且應盡可能使用,但它們不支持域特定對話框的要求。 在這些情況下,就需要創建自己的對話框。 如我們所見,對話框是具有特殊行為的窗口。Window 實現了這些行為,你可以使用窗口來創建自定義模式和非模式對話框。

自行創建對話框時,需要考慮許多設計注意事項。 盡管應用程序窗口和對話框有相似之處,例如共享相同的基類,但對話框用于特定目的。 當你需要提示用戶提供某種信息或響應時,通常需要對話框。 通常,應用程序會在顯示對話框(模式)時暫停,從而限制對應用程序其余部分的訪問。 對話框關閉后,應用程序將繼續運行。 但是,將交互僅限制于對話框并非必要。

當 WPF 窗口關閉時,它無法重新打開。 自定義對話框是 WPF 窗口,適用相同的規則。?

實現對話框

設計對話框時,請遵循以下建議來創造良好的用戶體驗:

? 不要讓對話框窗口變得雜亂無章。 對話框體驗是讓用戶輸入一些數據或做出選擇。

?? 務必提供“確定”按鈕來關閉窗口。

?? 務必將“確定”按鈕的?
IsDefault?屬性設置為?true,以允許用戶按?ENTER?鍵接受并關閉窗口。

?? 考慮添加“取消”按鈕,以便用戶可以關閉窗口并表明他們不想繼續操作。

?? 務必將“取消”按鈕的?
IsCancel?屬性設置為?true,以允許用戶按?ESC?鍵關閉窗口。

?? 務必設置窗口標題,以準確描述對話框所代表的內容,或者用戶應對對話框執行的操作。

?? 務必為窗口設置最小寬度和高度值,以防止用戶將窗口調整得太小。

?? 如果?
ShowInTaskbar?設置為?false,請考慮禁用調整窗口大小的功能。 可以通過將?
ResizeMode?設置為?
NoResize?來禁用調整大小

以下代碼演示了這種配置。

<Window x:Class="Dialogs.Margins"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Change Margins"Closing="Window_Closing"MinHeight="200"MinWidth="300"SizeToContent="WidthAndHeight"ResizeMode="NoResize"ShowInTaskbar="False"WindowStartupLocation="CenterOwner" FocusManager.FocusedElement="{Binding ElementName=leftMarginTextBox}"><Grid Margin="10"><Grid.Resources><!-- Default settings for controls --><Style TargetType="{x:Type Label}"><Setter Property="Margin" Value="0,3,5,5" /><Setter Property="Padding" Value="0,0,0,5" /></Style><Style TargetType="{x:Type TextBox}"><Setter Property="Margin" Value="0,0,0,5" /></Style><Style TargetType="{x:Type Button}"><Setter Property="Width" Value="70" /><Setter Property="Height" Value="25" /><Setter Property="Margin" Value="5,0,0,0" /></Style></Grid.Resources><Grid.ColumnDefinitions><ColumnDefinition Width="Auto" /><ColumnDefinition /></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /><RowDefinition /></Grid.RowDefinitions><!-- Left,Top,Right,Bottom margins--><Label Grid.Column="0" Grid.Row="0">Left Margin:</Label><TextBox Name="leftMarginTextBox" Grid.Column="1" Grid.Row="0" /><Label Grid.Column="0" Grid.Row="1">Top Margin:</Label><TextBox Name="topMarginTextBox" Grid.Column="1" Grid.Row="1"/><Label Grid.Column="0" Grid.Row="2">Right Margin:</Label><TextBox Name="rightMarginTextBox" Grid.Column="1" Grid.Row="2" /><Label Grid.Column="0" Grid.Row="3">Bottom Margin:</Label><TextBox Name="bottomMarginTextBox" Grid.Column="1" Grid.Row="3" /><!-- Accept or Cancel --><StackPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="4" Orientation="Horizontal" HorizontalAlignment="Right"><Button Name="okButton" Click="okButton_Click" IsDefault="True">OK</Button><Button Name="cancelButton" IsCancel="True">Cancel</Button></StackPanel></Grid >
</Window>

上述 XAML 創建了一個類似于下圖的窗口:

example-dialog.png?view=netdesktop-8.0

4、打開對話框的 UI 元素

對話框用戶體驗還擴展到打開對話框的窗口菜單欄或按鈕。 當菜單項或按鈕運行需要用戶通過對話框交互才能繼續運行的函數時,控件應在其標題文本的末尾使用省略號:

<MenuItem Header="_Margins..." Click="formatMarginsMenuItem_Click" />
<!-- or -->
<Button Content="_Margins..." Click="formatMarginsButton_Click" />

當菜單項或按鈕運行的函數顯示無需用戶交互的對話框(如“關于”對話框)時,則不需要省略號。

4.1 菜單項

菜單項是向用戶提供按相關主題分組的應用程序操作的常用方式。 你可能在許多不同的應用程序上看到過“文件”菜單。 在典型應用程序中,“文件”菜單項提供保存文件、加載文件和打印文件的方法。 如果操作要顯示模式窗口,則標題通常包含省略號,如下圖所示:

simple-text-editor-menu.png?view=netdesktop-8.0

其中兩個菜單項帶有省略號:...。 這有助于用戶確定,當他們選擇這些菜單項時,系統會顯示一個模式窗口,并暫停應用程序直到用戶關閉該窗口。

這種設計技術是向用戶傳達預期內容的一種簡單方法。

4.2 按鈕

你可以遵循菜單項
部分中所述的相同原則。 在按鈕文本上使用省略號表示當用戶按下按鈕時,會顯示一個模式對話框。 下圖中有兩個按鈕,哪個按鈕會顯示對話框一目了然:

simple-text-editor.png?view=netdesktop-8.0

5、返回結果

打開另一個窗口(尤其是模式對話框)是將狀態和信息返回給調用代碼的好方法。

5.1 模式對話框

通過調用 ShowDialog() 顯示對話框時,打開對話框的代碼會等待?ShowDialog?方法返回結果。 該方法返回結果時,調用它的代碼需要決定是繼續處理還是停止處理。 用戶通常通過按對話框上的“確定”或“取消”按鈕做出指示。

按下“確定”按鈕時,ShowDialog?應設計為返回?true,而按下“取消”按鈕時,應返回?false。 這是通過在按下按鈕時設置?
DialogResult?屬性來實現的。

private void okButton_Click(object sender, RoutedEventArgs e) =>DialogResult = true;private void cancelButton_Click(object sender, RoutedEventArgs e) =>DialogResult = false;

只有使用?
ShowDialog()?顯示對話框時,才能設置?
DialogResult?屬性。 設置?DialogResult?屬性后,對話框關閉。

如果按鈕的?
IsCancel?屬性設置為?true,并且使用?
ShowDialog()?打開窗口,則?ESC?鍵將關閉窗口并將?DialogResult?設置為?false

5.2 處理響應

ShowDialog()
?返回一個布爾值,指示用戶是接受還是取消了對話框。 如果你要提醒用戶注意某事,但不要求他們做出決定或提供數據,則可以忽略響應。 也可以通過檢查?
DialogResult?屬性來檢查響應。 以下代碼演示如何處理響應:

var dialog = new Margins();// Display the dialog box and read the response
bool? result = dialog.ShowDialog();if (result == true)
{// User accepted the dialog boxMessageBox.Show("Your request will be processed.");
}
else
{// User cancelled the dialog boxMessageBox.Show("Sorry it didn't work out, we'll try again later.");
}

5.3 非模式對話框

若要顯示非模式對話框,請調用?
Show()。 該對話框至少應提供“關閉”按鈕。 可以提供其他按鈕和交互元素來運行特定功能,例如提供“查找下一個”按鈕以在單詞搜索中查找下一個單詞。

由于非模式對話框不會阻止調用代碼繼續執行,因此你必須提供其他返回結果的方式。 可以執行以下操作之一:

  • 在窗口上公開數據對象屬性。
  • 處理調用代碼中的?
    Window.Closed?事件。
  • 在窗口上創建事件,這些事件在用戶選擇對象或按下特定按鈕時引發。

以下示例使用?
Window.Closed?事件在對話框關閉時向用戶顯示消息框。 顯示的消息引用已關閉對話框的屬性。?

var marginsWindow = new Margins();marginsWindow.Closed += (sender, eventArgs) =>
{MessageBox.Show($"You closed the margins window! It had the title of {marginsWindow.Title}");
};marginsWindow.Show();

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

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

相關文章

浙政釘SDK安裝

專有訂單SDK&#xff08;jar包&#xff09;下載 專有釘釘門戶 (dg-work.cn) Maven依賴 浙政釘 <!-- 浙政釘 --> <dependency><groupId>com.oracel</groupId><artifactId>zwdd-sdk-java</artifactId><version>1.2.0</version…

概率密度函數(PDF)正態分布

概率密度函數&#xff08;PDF&#xff09;是一個描述連續隨機變量取特定值的相對可能性的函數。對于正態分布的情況&#xff0c;其PDF有一個特定的形式&#xff0c;這個形式中包括了一個常數乘以一個指數函數&#xff0c;它假設誤差項服從均值為0的正態分布&#xff1a; p ( …

外匯天眼:新西蘭監管機構永久性停止對David McEwen及與其相關的實體的命令

新西蘭金融市場管理局&#xff08;FMA&#xff09;已對David Elgar McEwen及與其相關的實體&#xff08;McEwen and Associates&#xff09;發布了永久性停止令。 與McEwen先生相關的實體包括Stockfox Limited、Cosmopolitan Holdings Limited、Strategy Services Limited、Fun…

Ubuntu系統使用快速入門實踐(七)——軟件安裝與使用(3)

Ubuntu系統使用快速入門實踐系列文章 下面是Ubuntu系統使用系列文章的總鏈接&#xff0c;本人發表這個系列的文章鏈接均收錄于此 Ubuntu系統使用快速入門實踐系列文章總鏈接 下面是專欄地址&#xff1a; Ubuntu系統使用快速入門實踐系列文章專欄 文章目錄 Ubuntu系統使用快速…

在uniapp中,可以使用那些預定義的樣式類

u-flex&#xff1a;設置元素為彈性布局。u-flex-v&#xff1a;設置元素為縱向彈性布局。u-flex-h&#xff1a;設置元素為橫向彈性布局。u-p-10&#xff1a;設置元素的上下左右邊距為10rpx。u-p-t-10&#xff1a;設置元素的上邊距為10rpx。u-p-b-10&#xff1a;設置元素的下邊距…

教育心得整理

壓抑使人反抗&#xff0c;反抗就是報復&#xff0c;報復就會引起犯罪。要消滅犯罪&#xff0c;我們必須杜絕引起孩子報復心理的行為&#xff0c;更重要的是&#xff0c;我們一定要對孩子表現出來愛與尊重 限制批評的次數限制每次批評的范圍限制每次批評的強度 當彼此的信任和…

第一百九十五回 連接藍牙設備的細節

文章目錄 1. 概念介紹2. 實現方法2.1 示例代碼2.2 知識回顧2.3 實現方法3. 示例代碼我們在上一章回中介紹了"分享三個使用TextField的細節"沉浸式狀態樣相關的內容,本章回中將介紹SliverList組件.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在本章回中…

機器學習之無監督學習:九大聚類算法

今天&#xff0c;和大家分享一下機器學習之無監督學習中的常見的聚類方法。 今天&#xff0c;和大家分享一下機器學習之無監督學習中的常見的聚類方法。 在無監督學習中&#xff0c;我們的數據并不帶有任何標簽&#xff0c;因此在無監督學習中要做的就是將這一系列無標簽的數…

Spring Cloud Gateway中對admin端點進行認證

前言 我們被掃了一個漏洞&#xff0c;SpringBoot Actuator 未授權訪問&#xff0c;漏洞描述是這樣的&#xff1a; Actuator 是 springboot 提供的用來對應用系統進行自省和監控的功能模塊&#xff0c;借助于 Actuator 開發者可以很方便地對應用系統某些監控指標進行查看、統計…

計算機基礎知識65

cookie和session的使用 # 概念&#xff1a;cookie 是客戶端瀏覽器上的鍵值對 # 目的&#xff1a;為了做會話保持 # 來源&#xff1a;服務端寫入的&#xff0c;服務端再返回的響應頭中寫入&#xff0c;瀏覽器會自動取出來 存起來是以key value 形式&#xff0c;有過期時間、path…

STM32單片機項目實例:基于TouchGFX的智能手表設計(3)嵌入式程序任務調度的設計

STM32單片機項目實例&#xff1a;基于TouchGFX的智能手表設計&#xff08;3&#xff09;嵌入式程序任務調度的設計 目錄 一、嵌入式程序設計 1.1輪詢 1.2 前后臺&#xff08;中斷輪詢&#xff09; 1.3 事件驅動與消息 1.3.1 事件驅動的概念 1.4 定時器觸發事件驅動型的任…

golang游戲服務器 - tgf系列課程02

環境準備和服務創建 課程介紹了TGF框架的前期的準備工作,啟動一個websocket網關服務,和大廳邏輯節點。 文章最后附有項目案例地址和視頻教程地址,下期預告等信息安裝第三方軟件 tgf框架的服務發現依賴于Consul,所以我們需要先安裝并啟動Consul官網安裝 :訪問官網下載對應的包…

點云從入門到精通技術詳解100篇-針對三維點云分類神經網絡模型的不可感知對抗攻擊

目錄 前言 國內外研究現狀 三維點云分類神經網絡 三維點云傳統攻擊方法

C/C++ 實現動態資源文件釋放

當我們開發Windows應用程序時&#xff0c;通常會涉及到使用資源&#xff08;Resource&#xff09;的情況。資源可以包括圖標、位圖、字符串等&#xff0c;它們以二進制形式嵌入到可執行文件中。在某些情況下&#xff0c;我們可能需要從可執行文件中提取自定義資源并保存為獨立的…

vivado時序方法檢查7

TIMING-25 &#xff1a; 千兆位收發器 (GT) 上的時鐘波形無效 收發器輸出管腳 <pin_name> 上或連接到該管腳的信號線上定義的時鐘 <clock_name> 的波形與收發器設置不一 致&#xff0c; 或者缺少參考時鐘定義。自動衍生時鐘的周期為 <PERIOD> &#xf…

物聯網后端個人第十四周總結

物聯網方面進度 1.登陸超時是因為后端運行的端口和前端監聽的接口不一樣&#xff0c;所以后端也沒有報錯&#xff0c;將二者修改一致即可 2.登錄之后會進行平臺的初始化&#xff0c;但是初始化的時候會卡住,此時只需要將路徑的IP端口后邊的內容去掉即可 3.閱讀并完成了jetlinks…

通過誤差改變控制的兩種策略

如果反饋誤差越來越大&#xff0c;需要改變調節方向以減小誤差并實現更好的控制。以下是兩種常見的調節方向改變的方法&#xff1a; PID控制器中的積分限制&#xff1a;在PID控制中&#xff0c;積分項可以用來減小穩態誤差。然而&#xff0c;當反饋誤差持續增大時&#xff0c;積…

浪潮信息:數字化轉型的策略與實踐

在數字化浪潮的推動下&#xff0c;浪潮信息正致力于將計算創新推向新的高度。作為科技發展的排頭兵&#xff0c;浪潮信息深知算力的重要性&#xff0c;因此不斷探索前所未有的解決方案。在這個過程中&#xff0c;浪潮信息的研發人員和科技工作者如同探險家&#xff0c;勇敢地迎…

RocketMQ安裝和使用

RocketMQ快速入門 下載RocketMQ 下載地址 環境要求 Linux64位系統 JDK1.8(64位) 安裝RocketMQ 解壓 unzip rocketmq-all-4.4.0-bin-release.zip啟動RocketMQ 啟動NameServer # 1.啟動NameServer nohup sh bin/mqnamesrv & # 2.查看啟動日志 tail -f ~/logs/rocke…

學會用bash在linux寫腳本 (二)

接著上一章繼續 數值的對比 判斷語句 循環語句 22.5 比較、對比、判斷 在寫腳本時&#xff0c;有時需要做一些比較&#xff0c;例如&#xff0c;兩個數字誰大誰小&#xff0c;兩個字符串是否相同等。 做對比的表達式有[]、[[]]、test&#xff0c;其中[]和 test這兩種表達式的…