C# 如何正确处理快捷键和键盘事件?

C# 如何正确处理快捷键和键盘事件?,c#,.net,wpf,C#,.net,Wpf,如果您对捷径有疑问,请提供任何帮助/提示! 目标:我需要能够处理快捷键,无论我的应用程序中有没有修改器。 例如,我需要处理一个键“a”和“CTR+a”。但我只想在没有控件处理这些键的情况下处理它们。例如,TextBox类接受大多数键,包括一些命令,如“Ctrl+C”等,所以我不想在TextBox处理这些事件时截获它们 我尝试使用命令以及将事件附加到KeyUp到窗口,但是,命令在TextBox有机会查看键之前拦截键,即使TextBox使用了键,KeyDown也会在窗口级别冒泡!我如何让我的窗口获取

如果您对捷径有疑问,请提供任何帮助/提示! 目标:我需要能够处理快捷键,无论我的应用程序中有没有修改器。 例如,我需要处理一个键“a”和“CTR+a”。但我只想在没有控件处理这些键的情况下处理它们。例如,TextBox类接受大多数键,包括一些命令,如“Ctrl+C”等,所以我不想在TextBox处理这些事件时截获它们

我尝试使用命令以及将事件附加到KeyUp到窗口,但是,命令在TextBox有机会查看键之前拦截键,即使TextBox使用了键,KeyDown也会在窗口级别冒泡!我如何让我的窗口获取任何子控件都无法处理的键?请查看下面不适用于我的代码。此外,由于我有许多不同的控件,我宁愿有一个合适的解决方案:我不愿意将处理程序附加到窗口中控件的每个实例

<Window x:Class="KeyTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

<Window.CommandBindings>
    <CommandBinding Command="Help"
                    CanExecute="HelpCanExecute"
                    Executed="HelpExecuted" />
</Window.CommandBindings>

<Window.InputBindings>
    <KeyBinding Command="Help" Key="H" />
</Window.InputBindings>

<Grid>
    <WrapPanel>
        <TextBox Name="myLOG" Width="300" Height="200" Background="LightBlue" />
        <TextBox Name="myINPUT" Width="300" Height="200" />
        <Button Content="JUST FOR FUN" />
    </WrapPanel>
</Grid>
对于C

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace KeyTest
{
   /// <summary>
   /// Interaction logic for MainWindow.xaml
   /// </summary>
   public partial class MainWindow : Window
   {
      private void HelpCanExecute(object sender, CanExecuteRoutedEventArgs e)
      {
         myLOG.Text += "HELP CAN EXECUTE\n";
         e.CanExecute = true;
         e.Handled = true;
      }

      private void HelpExecuted(object sender, ExecutedRoutedEventArgs e)
      {
         myLOG.Text += "HELP  EXECUTED!!!\n";
         e.Handled = true;
      }

      public void myKeyUpHandler(Object sender, KeyEventArgs args)
      {
         myLOG.Text += "KEY UP EVENT! " + args.Key + "\n";
      }

      public MainWindow()
      {
         InitializeComponent();
         this.KeyUp += new KeyEventHandler(myKeyUpHandler);
      }
   }
}
当焦点位于文本框中时,按h键将触发命令,即使我希望“h”只转到文本框。此外,在textbox内部,按下任何字母数字键都会触发KeyUp事件,即使据我所知,textbox应该已经处理了=true的事件


谢谢你的帮助

Dude我认为这里需要使用previewKeyDown或PreviewKeyUp事件,而不是keyup事件,因为previewKeyDown和PreviewKeyUp事件会产生隧道效应,而不是冒泡效应,在冒泡效应中,从触发事件的控件的根父级开始触发的事件也会触发最初触发事件的控件被称为原始来源。您可以利用这个隧道效应来处理事件,而不是使用通过冒泡效应触发的事件。另一件事是PreviewKeyDown和PreviewKeyUp事件在keydown事件发生之前触发。这可以让您以最干净的方式拦截事件

另一件事,我认为您需要检查事件的原始源,以便可以选择可以触发此事件的控件

下面是一个示例代码

 public void nameOfCotrol_PreviewKeyDown(object sender, RoutedEventArgs e)
 {
    if((e.OriginalSource as Control).Name == "NameOfControls That would be allowed to fire the event")
    {
        You're stuff to be done here
    }
    else
    {
        e.handled = true;
     }
 }

我希望这能起到一点作用。谢谢

您需要使用预览事件类型进行调查。它们发生在其他控件处理事件之前。然后你想阻止事件冒泡。我相信你用e.Handled做的是正确的

对此进行调查:


不知道如何在xaml中实现您想要做的事情。表达式混合库对于从事件派生命令非常有用。请参见此处:

+1这是一个非常有用的问题,可以作为WPF初学者的参考。我强烈建议您将内容保留在命令中,而不是代码隐藏中。