我有一个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
按钮上),对话框也会按预期关闭。但是,当焦点不在Enter
按钮上时按OK
键时,没有任何反应。
对话框中有DataGrid
。我想在数据网格中选择任何行并按Enter键时关闭对话框。
如何让这件事发生?
其他一些信息:对话框中有一个文本框。它有Keyboard.PreviewKeyDown
事件的事件处理程序。当我在文本框中并按Enter键时,不应关闭对话框。 但我可以删除此处理程序。重要的是要解决上面的问题。
private void tbxSearchString_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
this.Search(); // Does some searching
}
}
答案 0 :(得分:8)
没有内置的方法来关闭wpf中的对话框窗口。你要做的是将DialogResult设置为默认按钮。所以你需要的是:
XAML
<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" />
代码隐藏:
private void btnOK_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
}
答案 1 :(得分:7)
您的代码对我来说很好。按Enter键时关闭对话框。你可以写e.Handled = true;在tbxSearchString_PreviewKeyDown事件中搜索功能之后的行。所以它不会关闭对话框。
<Grid>
<TextBox Name="tbxSearchString" HorizontalAlignment="Left" Width="100" Height="30" Grid.Row="0" PreviewKeyDown="tt_PreviewKeyDown"></TextBox>
<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>
</Grid>
private void btnOK_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void tbxSearchString_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
this.Search();
e.Handled = true;
}
}
答案 2 :(得分:6)
您不应该自己致电Close()
或处理PreviewKeyDown
。
执行此操作的正确方法是使用“确定/取消”按钮,然后使用Button.IsDefault
,Button.IsCancel
和Window.DialogResult
。如果&#39;输入&#39;按键未在文本框中处理,按键将传播到Window
,默认按钮将被按下。
MyForm.xaml:
<Button x:Name="btnOk" Content="Ok" Click="btnOk_Click" IsDefault="True"/>
<Button x:Name="btnCancel" Content="Cancel" Click="btnCancel_Click" IsCancel="True"/>
MyForm.xaml.cs:
private void btnOk_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
}
现在在表单中的任何文本框中输入或转义将关闭表单(具有正确的结果)
答案 3 :(得分:0)
只需将AcceptButton成员设置为按钮属性名称。
AcceptButton = btnOK; // button used when ENTER is pressed