2009年9月2日 星期三

在WPF中自訂強制回應對話框(Dialog Box)

就像在WPF中的對話框(Dialog Box)中說的
新增一個對話框其實跟新增視窗沒有差別

從視窗的設定來說,強制回應對話框至少要有可以跟使用者互動(對話)的功能,而且除了簡單的通知功能之外(MessageBox),通常會希望使用者能夠表達出他的選擇,所以一般來說,對話框至少需要正反兩個選項。


<Window x:Class="test_wpf.NewDialog"
...>
<Grid>
<!--set an event handler as button clicked-->
<Button Width="100" HorizontalAlignment="Left"
Margin="10,10,0,10" Click="Ok_Click">
OK
</Button>
<!--a button with IsCancel property is just
like the close button in title bar, so there
is no need to add a click event handler-->

<Button Width="100" HorizontalAlignment="Right"
Margin="0,10,10,10" IsCancel="True">
Cancel
</Button>
</Grid>
</Window>

注意,這時候因為第二個按鈕設成IsCancel,所以按下它相當於按下視窗預設的關閉鍵,而此時視窗關閉,並將DialogResult設成false(英文版和中文版的msdn寫的不同,但經測試回傳為false),所以不需要額外寫事件處理,而第一個按鈕的事件處理如下

private void Ok_Click(object sender, RoutedEventArgs e)
{
/// set DialogResult and the window will close
/// automatically and no need to call Close()

DialogResult = true;
}

此時因為設定DialogResult,視窗自動關閉,不需要額外呼叫Close()

使用對話框其實就是使用視窗,只是Show出來的方法不同

NewDialog d = new NewDialog();
if ((bool)d.ShowDialog())
{
/// process when DialogResult is true
MessageBox.Show("OK");
}
else
{
/// process when DialogResult is false
MessageBox.Show("Cancel");
}

--
參考資料
對話方塊概觀

1 則留言:

  1. 不好意思,我照著您的範例來寫
    先弄了一個MainWindow出來,再產生您所寫的NewDialog

    結果在按下NewDialog的 OK 按鈕的時候,卻連MainWindow一起消失了
    後面的 MessageBox.Show 也沒有印出來

    這是跟版本的差異有關嗎?我所使用的是visual studio 2010 express
    謝謝

    回覆刪除