如何正确处理快捷键和键盘事件
本文关键字:键盘 事件 快捷键 正确处理 | 更新日期: 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;
}
}
我希望这能帮上一点忙。由于