Как закрыть окно 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