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

本文关键字:键盘 事件 快捷键 正确处理 | 更新日期: 2023-09-27 18:18:13

有一个快捷方式的问题,任何帮助/提示将不胜感激!目标:我需要能够处理快捷键,在我的应用程序中有和没有修饰符。因此,例如,我需要处理键"a"以及"CTR+a"。但我只想在没有控件处理这些键的情况下处理它们。例如,TextBox类接受大多数键,包括一些命令,如'Ctrl+C'等,所以我不想拦截这些事件时,TextBox将处理它们。

我尝试使用命令以及将事件附加到KeyUp到窗口,但是,命令在文本框有机会查看它们之前拦截键,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"只进入文本框。此外,当在文本框内,按任何alpha数字键触发KeyUp事件,即使据我所知,文本框应该处理=true事件!

谢谢你的帮助!

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

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

调查这个:http://msdn.microsoft.com/en-us/library/system.windows.input.keyboard.previewkeydown.aspx

不确定如何在xaml中做你想做的事情。表达式混合库对于从事件生成命令非常有帮助。详见:http://jacokarsten.wordpress.com/2009/03/27/applying-command-binding-to-any-control-and-any-event/

Dude,我认为你需要使用previewKeyDown或PreviewKeyUp事件而不是keyup事件,因为previewKeyDown和PreviewKeyUp事件产生隧道效应(与冒气泡效应相反,事件从触发事件的控件的RootParent开始,该控件向下触发了最初触发事件的控件(也称为原始源))。您可以利用这种隧道效应来处理事件,而不是使用通过冒泡效应触发的事件。另一件事是PreviewKeyDown和PrevieKeyup事件在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;
     }
 }

我希望这能帮上一点忙。由于