Как закрыть окно WPF (диалоговое окно) при нажатии клавиши Enter?

у меня есть 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 ключ, когда фокус не на ничего не происходит.

у меня есть DataGrid в диалоговом окне. Я хочу закрыть диалоговое окно, когда я выбираю любую строку в сетке данных и нажимаю enter.

как сделать это произошло?

дополнительная информация: у меня есть текстовое поле в диалоговом окне. И у него есть обработчик событий для Keyboard.PreviewKeyDown событие. Когда я в текстовое поле и я нажимаю enter, диалоговое окно не должно быть закрыто. но я могу удалить этот обработчик. Важно, чтобы вопрос был решен.

private void tbxSearchString_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        this.Search(); // Does some searching
    }
}

4 ответов


ваш код отлично работает для меня. он закрывает диалог, когда я нажимаю 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;
           }
        }

нет встроенного способа закрыть диалоговое окно в 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" />

codebehind:

    private void btnOK_Click(object sender, RoutedEventArgs e)
    {
        DialogResult = true;
    }

вы не должны звонить Close() или обработки PreviewKeyDown себя.

правильный способ сделать это - иметь кнопки Ok / Cancel и использовать Button.IsDefault, Button.IsCancel и Window.DialogResult. Если нажатие "enter" не обработано в вашем текстовом поле, нажатие клавиши будет распространяться на 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;
}

Теперь нажмите enter или escape on любой поле в форме закроется форма (с правильным результатом)


просто установите член AcceptButton в имя свойства button.

AcceptButton = btnOK;   // button used when ENTER is pressed