我希望Escape键关闭我的WPF窗口。但是,如果有一个控件可以使用该Escape键,我不想关闭Window。有关按ESC键时如何关闭WPF窗口的多种解决方案。例如。 How does the WPF Button.IsCancel property work?
但是,此解决方案会关闭Window,而不考虑是否存在可以使用Escape键的活动控件。
例如。我有一个带有DataGrid的Window。 dataGrid上的一列是组合框。如果我正在更改ComboBox,并点击Escape,那么控件应该来自编辑comboBox(正常行为)。如果我现在再次击中Escape,那么Window应该关闭。我想要一个通用的解决方案,而不是编写大量的自定义代码。
如果你能用C#提供解决方案,那就太好了。
答案 0 :(得分:3)
您应该使用KeyDown
事件而不是PreviewKeyDown
事件。如果Window
的任何子项处理该事件,它将不会被冒泡到窗口(PreviewKeyDown
向下的Window
隧道,因此您的事件处理程序将不会调用。
答案 1 :(得分:1)
可能有一种更简单的方法,但您可以使用哈希码来实现。 Keys.Escape是另一种选择,但有时候由于某些原因我不能让它工作。你没有指定一种语言,所以这里是VB.NET中的一个例子:
Private Sub someTextField_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles someTextField.KeyPress
If e.KeyChar.GetHashCode = 1769499 Then ''this number is the hash code for escape on my computer, do not know if it is the same for all computers though.
MsgBox("escape pressed") ''put some logic in here that determines what ever you wanted to know about your "active control"
End If
End Sub
答案 2 :(得分:1)
class Commands
{
static Command
{
CloseWindow = NewCommand("Close Window", "CloseWindow", new KeyGesture(Key.Escape));
CloseWindowDefaultBinding = new CommandBinding(CloseWindow,
CloseWindowExecute, CloseWindowCanExecute);
}
public static CommandBinding CloseWindowDefaultBinding { get; private set; }
public static RoutedUICommand CloseWindow { get; private set; }
static void CloseWindowCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = sender != null && sender is System.Windows.Window;
e.Handled = true;
}
static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e)
{
((System.Windows.Window)sender).Close();
}
}
// In your window class's constructor. This could also be done
// as a static resource in the window's XAML resources.
CommandBindings.Add(Commands.CloseWindowDefaultBinding);