WPF:如何防止窃取关键手势控制? [英] WPF: How to prevent a control from stealing a key gesture?
问题描述
在我的WPF应用程序,我想输入的手势附加到命令,这样用户输入的手势全球可用在主窗口中,无论哪个控件具有焦点。
In my WPF application I would like to attach an input gesture to a command so that the input gesture is globally available in the main window, no matter which control has the focus.
在我的情况,我想不过来绑定 Key.PageDown
来的命令,只要某些控件接收焦点(如文本框或TreeView控件) ,这些控件接受的关键事件和命令不再触发。这些控件有没有具体的 CommandBindings
或 InputBindings
定义。
In my case I would like to bind Key.PageDown
to a command, however, as soon as certain controls receive the focus (e.g. a TextBox or TreeView control), these controls receive the key events and the command is no longer triggered. These controls have no specific CommandBindings
or InputBindings
defined.
这是我如何定义我的输入姿势:
This is how I define my input gesture:
XAML:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" >
<StackPanel>
<TreeView>
<TreeViewItem Header="1">
<TreeViewItem Header="1.1"></TreeViewItem>
<TreeViewItem Header="1.2"></TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="2" ></TreeViewItem>
</TreeView>
<TextBox />
<Label Name="label1" />
</StackPanel>
</Window>
代码:
Code:
using System;
using System.Windows;
using System.Windows.Input;
public static class Commands
{
private static RoutedUICommand _myCommand;
static Commands()
{
_myCommand = new RoutedUICommand("My Command",
"My Command",
typeof(Commands),
new InputGestureCollection()
{
new KeyGesture(Key.PageDown, ModifierKeys.None)
});
}
public static ICommand MyCommand
{
get { return _myCommand; }
}
}
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
CommandBinding cb = new CommandBinding();
cb.Command = Commands.MyCommand;
cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);
cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);
this.CommandBindings.Add(cb);
}
void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
void cb_Executed(object sender, ExecutedRoutedEventArgs e)
{
this.label1.Content = string.Format("My Command was executed {0}", DateTime.Now);
}
}
我已经尝试捕获窗口的 PreviewKeyDown
事件并将其标记为处理这早已不是预期的效果。我还设置了可聚焦
属性假
。这有助于对TextBox控件,但不适合在TreeView(并具有不想要的效果,即在TextBox不再可以被编辑,所以它不是对我的溶液)。
I already tried catching the window's PreviewKeyDown
event and marking it as handled This had not the desired effect. I also set the Focusable
property to false
. This helped for TextBox controls, but not for the TreeView (and has the unwanted effect, that the TextBox no longer can be edited so it is not a solution for me).
所以我的问题是我怎么能定义一个快捷键,在主窗口的工作原理无处不在?
So my question is how can I define a keyboard shortcut that works everywhere in the main window?
推荐答案
以下解决方法似乎有具有命令全球到窗口的期望的效果;但是,我仍然不知道是否有这样做的WPF没有更简单的方法:
The following workaround seems to have the desired effect of having the command global to the window; however, I still wonder whether there is no easier way to do this in WPF:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
foreach (InputBinding inputBinding in this.InputBindings)
{
KeyGesture keyGesture = inputBinding.Gesture as KeyGesture;
if (keyGesture != null && keyGesture.Key == e.Key && keyGesture.Modifiers == Keyboard.Modifiers)
{
if (inputBinding.Command != null)
{
inputBinding.Command.Execute(0);
e.Handled = true;
}
}
}
foreach (CommandBinding cb in this.CommandBindings)
{
RoutedCommand command = cb.Command as RoutedCommand;
if (command != null)
{
foreach (InputGesture inputGesture in command.InputGestures)
{
KeyGesture keyGesture = inputGesture as KeyGesture;
if (keyGesture != null && keyGesture.Key == e.Key && keyGesture.Modifiers == Keyboard.Modifiers)
{
command.Execute(0, this);
e.Handled = true;
}
}
}
}
}
}
这篇关于WPF:如何防止窃取关键手势控制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!