在 WPF 程式中, 要開啟一個對話視窗的方法和在 Windows Form 裡面不太一樣。最顯著的差異, 在於 WPF 的 Button 控制項中並沒有 DialogResult 屬性可用。不過他們的基本原理還是差不多的。以下我將示範如何在 WPF 加入對話視窗的祥細步驟...
在 WPF 程式中, 要開啟一個對話視窗的方法和在 Windows Form 裡面不太一樣。最顯著的差異, 在於 WPF 的 Button 控制項中並沒有 DialogResult 屬性可用。不過他們的基本原理還是差不多的。
以下我將示範如何在 WPF 加入對話視窗的祥細步驟。
步驟
1. 在你的專案中新增一個 WPF 視窗
2. 將這個新視窗取名為 Confirm (你可以自行命名; 但在此範例中此視窗將使用 Confirm 這個名稱)
3. 在 Confirm.xaml 檔案中加入如下的三個控制項
<Grid Height="101" Width="301">
<Label Content="You are about to leave this page. Are you sure?" Height="54" HorizontalAlignment="Left" Margin="12,12,0,0" Name="lbMessage" VerticalAlignment="Top" />
<Button Content="I am sure" Height="23" HorizontalAlignment="Left" Margin="57,60,0,0" Name="btnOK" VerticalAlignment="Top" Width="75" Click="btnOK_Click" />
<Button Content="Cancel" Height="23" HorizontalAlignment="Left" Margin="165,60,0,0" Name="btnCancel" VerticalAlignment="Top" Width="75" Click="btnCancel_Click" />
</Grid>
請特別注意這三個新的控制項的 Name。在本範例中它們命名為 lbMessage, btnOK 與 btnCancel。
如果你這時候啟動除錯, 會看到兩個錯誤訊息。這是因為我們當未撰寫兩個按鈕的 Event Handler 的緣故。
你從 Visual Studio 設計畫面上應該可以看到本範例視窗的樣子, 如下所示。
你可以自行調整視窗大小以符合畫面。
4. 在 Confirm.xaml.cs 中加入以下程式碼:
private void btnOK_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
}
到此, Confirm 視窗的設計部份基本上已經完成了。
4. 為示範方便, 請在其它任意視窗中(在本範例中為 MainWindow.xaml)加入一個按鈕, 如下所示:
<Button Content="Ask Me!" Height="23" HorizontalAlignment="Left" Margin="24,41,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
5. 其 Event Handler 在 MainWindow.xaml.cs 中的對應程式碼如下:
Confirm confirm = new Confirm();
confirm.ShowDialog();
if (confirm.DialogResult.HasValue && confirm.DialogResult.Value)
{
// Do anything you like
}
擴充功能
其實 DialogResult 回傳值在 WPF 中變成三值的 bool? 型別, 也就是 True, False 以及 Null。在以上的範例中我們應用了 True 與 False 兩個值。也就是說, 如果使用者按下 OK, 那麼程式就會執行我以 // Do anything you like 標示所在的程式碼。如果使用者按下 Cencel 按鈕或直接關閉視窗, 就什麼事也不做。
private void button1_Click(object sender, RoutedEventArgs e)
{
Confirm confirm = new Confirm();
confirm.ShowDialog();
if (confirm.DialogResult.HasValue && confirm.DialogResult.Value)
MessageBox.Show("You pressed OK!");
else
MessageBox.Show("You pressed Cancel!");
}
此外, 我也把程式稍為做了一些變化, 加入了一些屬性, 還有 Confirm 視窗的 Constructor 多載, 使得你可以更有彈性的使用 Confirm 視窗。例如, 你現在可以把原來的 new Confirm(); 這行指令改成如下:
Confirm confirm = new Confirm("你如果按下OK, 你之前打過的字都白打了喔!");
如此, 你就可以在不同程式中方便的選擇採用不同的顯示訊息。
這些小小的擴充功能都不影響原本的功能, 所以我就不一一解釋了。各位可以下載完整範例 (C#版本或VB版本)自行研究。