如何将CTRL + SHIFT + V指定为KeyGesture?

时间:2014-01-26 03:59:38

标签: c# wpf key-bindings

我创建了一个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 )
        }
    );
}

3 个答案:

答案 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);
}