Как закрыть окно WPF (диалоговое окно) при нажатии клавиши Enter? - PullRequest
7 голосов
/ 22 сентября 2011

У меня есть 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 в диалоговом окне. Я хочу закрыть диалоговое окно, когда я выбираю любую строку в сетке данных и нажимаю ввод.

Как это сделать?

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

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

Ответы [ 4 ]

8 голосов
/ 22 сентября 2011

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

Ваш код работает нормально для меня.это закрывает диалог, когда я нажимаю 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;
           }
        }
6 голосов
/ 26 декабря 2016

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

Правильный способ сделать это - использовать кнопки Ok / Cancel и использовать Button.IsDefault, Button.IsCancel иWindow.DialogResult.Если в вашем текстовом поле не нажата клавиша «Ввод», нажатие клавиши будет распространяться на Window, и будет нажата кнопка по умолчанию.* MyForm.xaml.cs:

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

private void btnCancel_Click(object sender, RoutedEventArgs e)
{
    DialogResult = false;
}

Теперь нажмите клавишу ввода или выхода на любое текстовое поле в форме закроет форму (с правильным результатом)

0 голосов
/ 05 ноября 2016

Просто установите для элемента AcceptButton имя свойства кнопки.

AcceptButton = btnOK;   // button used when ENTER is pressed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...