【发布时间】:2011-11-22 12:43:46
【问题描述】:
我有一个 WPF window,它作为模式对话框打开。
在对话框中,我有 OK 和 Cancel 按钮,它们的 IsDefault 和 IsCancel 属性分别设置为 True。这两个按钮都有Click 关闭对话框的事件处理程序。
这里是相关的 XAML:
<StackPanel Orientation="Horizontal" Grid.Row="1" Height="45" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="190">
<Button Content="OK"
Height="25" Margin="10,10,10,10" Width="75" Name="btnOK" TabIndex="1600" IsDefault="True" Click="btnOK_Click"
VerticalContentAlignment="Center" HorizontalContentAlignment="Center" />
<Button Content="Cancel"
Height="25" Margin="10,10,10,10" Width="75" Name="btnCancel" TabIndex="1700" IsCancel="True"
VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Click="btnCancel_Click" />
</StackPanel>
下面是代码:
private void btnOK_Click(object sender, RoutedEventArgs e)
{
// My some business logic is here
this.Close();
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
当我按下键盘上的Esc 按钮时(即使焦点不在Cancel 按钮上),对话框也会按预期关闭。但是,当我在焦点不在OK 按钮上时按Enter 键时,什么也没有发生。
我在对话框中有一个DataGrid。当我选择数据网格中的任何行并按 Enter 时,我想关闭对话框。
如何做到这一点?
一些附加信息:我在对话框上有一个文本框。它具有Keyboard.PreviewKeyDown 事件的事件处理程序。当我在文本框中并按 Enter 键时,不应关闭对话框。 但我可以删除这个处理程序。重要的是解决上述问题。
private void tbxSearchString_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
this.Search(); // Does some searching
}
}
【问题讨论】:
-
你遇到的是默认和预期的行为,你不应该改变它。此外,您处理对话的方式有点异国情调。通常,您应该只在按钮的事件处理程序中将
DialogResult设置为true或false,并且应该在打开对话框的代码中完成逻辑,如下所示:if ((bool)diag.ShowDialog()) { /*Here*/ }。跨度> -
+1 导致 H.B.太快了... :)
-
+1 指出正确的编码方式 (
DialogResult)! :)
标签: c# wpf xaml wpf-controls wpfdatagrid