我创建了一个RoutedUICommand
来粘贴剪贴板中的纯文本。如果我将Key.V
作业更改为Key.G
或其他内容则可以。我假设当前控件(RichTextBox
)正在拦截该命令。我尝试用Snoop验证这一点。但是,我似乎不够聪明,找不到罪魁祸首。有没有人见过这种行为?有解决方法吗?
有没有办法找出可能已经在窗口或控件中分配了哪些KeyGestures?
// I REALLY want to use CTRL + SHIFT + V here but it seems to be ignored.
public static readonly RoutedUICommand PasteUnformattedText = new RoutedUICommand
(
"Paste Text Only",
"PasteUnformattedText",
typeof(CustomCommands),
new InputGestureCollection()
{
new KeyGesture(Key.V, ModifierKeys.Control | ModifierKeys.Shift )
}
);
}
答案 0 :(得分:2)
感谢OxA3的问题和他自己的answer,我找到了一个解决方法。在窗口上使用Preview_KeyDown事件具有所需的效果。解决方法只是将KeyGestures的全部推送到窗口。
这在2009年得到了解答。我研究了很长时间,直到今天才找到它。我想在这里发布答案,以便任何正在寻找关于KeyGestures更具体的东西的人都会找到它。
我通过在Keyboard.Modifiers状态上添加条件来抢占foreach循环。以下是我的更改:
void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
{
// don't bother with it if we are not modified
if (Keyboard.Modifiers == ModifierKeys.None) return;
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;
}
}
}
}
}
答案 1 :(得分:0)
请参阅此article。
WPF的内置KeyGesture类是一个InputGesture子类 识别基于键盘输入的手势。问题是,它 “手势”的定义是单个按键。我想做的是 将多个按键视为单个手势,而KeyGesture则不会 支持。
答案 2 :(得分:0)
要添加@ shahrooz-jafari的答案,您可以在WPF键手势中使用多个键绑定。
public RoutedCommand myCommand = new RoutedCommand();
public void Init() {
myCommand.InputGestures.Add(new KeyGesture(Key.V, ModifierKeys.Control | ModifierKeys.Shift);
var bind = new CommandBinding { Command = myCommand };
bind.Executed += new ExecutedRoutedEventHandler((sender,e) => {
// do stuff here.
});
CommandBindings.Add(bind);
}