CSharpLearner CSharpLearner - 1 month ago 7
C# Question

How to close WPF window (dialog box) when Enter key is pressed?

I have a WPF

window
which opens as a modal dialog.

On dialog, I have
OK
&
Cancel
buttons with
IsDefault
&
IsCancel
properties set to
True
for them respectively. Both the buttons have
Click
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 the
Cancel
button), the dialog box gets closed as expected. However, when I press
Enter
key when focus is NOT on the
OK
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
}
}

Answer

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;
           }
        }