目錄
1、消息框
2、通用對話框
3、自定義對話框
實現對話框
4、打開對話框的 UI 元素
4.1 菜單項
4.2 按鈕
5、返回結果
5.1 模式對話框
5.2 處理響應
5.3 非模式對話框
Windows Presentation Foundation (WPF) 為你提供了自行設計對話框的方法。 對話框是窗口,但具有特定的意圖和用戶體驗。 本文討論對話框的工作原理以及可以創建和使用的對話框類型。 對話框用于:
- 向用戶顯示特定信息。
- 從用戶處收集信息。
- 同時顯示并收集信息。
- 顯示操作系統提示,例如打印窗口。
- 選擇文件或文件夾。
這些類型的窗口稱為對話框。 對話框可以通過兩種方式顯示:模式和非模式。
向用戶顯示模式對話框是一種技術,應用程序使用該技術中斷其正在執行的操作,直到用戶關閉對話框。 這通常以提示或警報的形式出現。 在關閉對話框之前,無法與應用程序中的其他窗口進行交互。?模式對話框關閉后,應用程序將繼續運行。 最常見的對話框用于顯示打開文件或保存文件提示、顯示打印機對話框或向用戶發送一些狀態消息。
非模式對話框打開時不會阻止用戶激活其他窗口。 例如,如果用戶想要在文檔中查找特定單詞的匹配項,主窗口通常會打開一個對話框,詢問用戶要查找什么單詞。 由于應用程序不想阻止用戶編輯文檔,因此該對話框不必為模式對話框。 非模式對話框至少提供“關閉”按鈕來關閉對話框。 可能還會提供其他按鈕來運行特定功能,例如提供“查找下一個”按鈕以在單詞搜索中查找下一個單詞。
你可以使用 WPF 創建多種類型的對話框,例如消息框、通用對話框和自定義對話框。 本文將討論每種對話框,
對話框示例提供了匹配示例。
1、消息框
消息框是可以用來顯示文本信息并使用戶可以使用按鈕做出決定的對話框。 下圖顯示了一個消息框,框中詢問問題并為用戶提供三個按鈕來回答問題。
要創建消息框,可以使用MessageBox?
類。?
MessageBox?允許你配置消息框文本、標題、圖標和按鈕。
2、通用對話框
Windows 實現了所有應用程序通用的不同類型的可重用對話框,其中包括用于選擇文件和打印的對話框。
由于這些對話框是由操作系統提供的,因此它們在操作系統上運行的所有應用程序之間共享。 這些對話框提供一致的用戶體驗,被稱為通用對話框。 當用戶在一個應用程序中使用通用對話框時,他們不需要學習如何在其他應用程序中使用該對話框。
WPF 封裝了“打開文件”、“保存文件”、“打開文件夾”和“打印”通用對話框,并將它們公開為托管類,供你使用。
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 創建了一個類似于下圖的窗口:
4、打開對話框的 UI 元素
對話框用戶體驗還擴展到打開對話框的窗口菜單欄或按鈕。 當菜單項或按鈕運行需要用戶通過對話框交互才能繼續運行的函數時,控件應在其標題文本的末尾使用省略號:
<MenuItem Header="_Margins..." Click="formatMarginsMenuItem_Click" />
<!-- or -->
<Button Content="_Margins..." Click="formatMarginsButton_Click" />
當菜單項或按鈕運行的函數顯示無需用戶交互的對話框(如“關于”對話框)時,則不需要省略號。
4.1 菜單項
菜單項是向用戶提供按相關主題分組的應用程序操作的常用方式。 你可能在許多不同的應用程序上看到過“文件”菜單。 在典型應用程序中,“文件”菜單項提供保存文件、加載文件和打印文件的方法。 如果操作要顯示模式窗口,則標題通常包含省略號,如下圖所示:
其中兩個菜單項帶有省略號:...
。 這有助于用戶確定,當他們選擇這些菜單項時,系統會顯示一個模式窗口,并暫停應用程序直到用戶關閉該窗口。
這種設計技術是向用戶傳達預期內容的一種簡單方法。
4.2 按鈕
你可以遵循菜單項
部分中所述的相同原則。 在按鈕文本上使用省略號表示當用戶按下按鈕時,會顯示一個模式對話框。 下圖中有兩個按鈕,哪個按鈕會顯示對話框一目了然:
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();