How to close WPF window (dialog box) when Enter key is pressed?
Solution 1
Your code is working fine for me. it close dialog when I press enter. You can write e.Handled = true; line after your search functionality in tbxSearchString_PreviewKeyDown event. So it will not close dialog.
<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>
Code behind
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;
}
}
Solution 2
there is no built-in way to close the dialog window in wpf. what you have to do, is to set the DialogResult for your default button. so all you need is the following:
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" />
codebehind:
private void btnOK_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
}
Solution 3
You shouldn't be calling Close()
or handling PreviewKeyDown
yourself.
The proper way to do this is to have Ok/Cancel buttons, and use Button.IsDefault
, Button.IsCancel
, and Window.DialogResult
. If the 'enter' press is unhandled in your textbox, the keypress will propagate to the Window
and the default button will be pressed.
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;
}
Now hitting enter or escape on any textbox in the form will close the form (with the proper result)
Learner
Updated on December 26, 2020Comments
-
Learner over 3 years
I have a WPF
window
which opens as a modal dialog.On dialog, I have
OK
&Cancel
buttons withIsDefault
&IsCancel
properties set toTrue
for them respectively. Both the buttons haveClick
event handlers which close the dialog box.Here is the relevant 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>
Here is the code behind:
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(); }
When I press
Esc
button on the keyboard (even when focus is not on theCancel
button), the dialog box gets closed as expected. However, when I pressEnter
key when focus is NOT on theOK
button, nothing happens.I have a
DataGrid
on the dialog. I want to close the dialog when I select any row in the data grid and press enter.How to make this thing happen?
Some additional information: I have a text box on the dialog. And it has the event handler for the
Keyboard.PreviewKeyDown
event. When I am in the text box and I press enter, the dialog box should not be closed. But I can remove this handler. Important thing is to get above question resolved.private void tbxSearchString_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { this.Search(); // Does some searching } }