在wpf中的多键手势

时间:2010-02-02 05:03:38

标签: wpf hotkeys routed-commands

我有RoutedUICommand名为Comment Selection。我需要为这个命令添加一个输入手势,就像它在VIsual Studio中一样,即。 ( Ctrl + K Ctrl + C )。 我怎样才能做到这一点? Plz帮助我。 (记住VS功能)。

问候,贾瓦哈尔

4 个答案:

答案 0 :(得分:3)

此代码适用于“Ctrl + W,Ctrl + E”和/或“Ctrl + W,E”组合,但您可以对任何组合键进行参数化:

XAML:

<MenuItem Header="Header" InputGestureText="Ctrl+W, E" Command="ShowCommand"/>

C#:

public static readonly RoutedUICommand ShowCommand = new RoutedUICommand(
    "Show command text", 
    "Show command desc", 
    typeof(ThisWindow), 
    new InputGestureCollection(new[] { new ShowCommandGesture (Key.E) }));

public class ShowCommandGesture : InputGesture
{
    private readonly Key _key;
    private bool _gotFirstGesture;
    private readonly InputGesture _ctrlWGesture = new KeyGesture(Key.W, ModifierKeys.Control);

    public ShowCommandGesture(Key key)
    {
        _key = key;
    }

    public override bool Matches(object obj, InputEventArgs inputEventArgs)
    {
        KeyEventArgs keyArgs = inputEventArgs as KeyEventArgs;
        if (keyArgs == null || keyArgs.IsRepeat)
            return false;

        if (_gotFirstGesture)
        {
            _gotFirstGesture = false;

            if (keyArgs.Key == _key)
            {
                inputEventArgs.Handled = true;
            }

            return keyArgs.Key == _key;
        }
        else
        {
            _gotFirstGesture = _ctrlWGesture.Matches(null, inputEventArgs);
            if (_gotFirstGesture)
            {
                inputEventArgs.Handled = true;
            }

            return false;
        }
    }
}

答案 1 :(得分:2)

我发现这篇博文我认为可以提供帮助

http://kent-boogaart.com/blog/multikeygesture

基本上,WPF没有内置的支持,但是继承InputGesture或KeyGesture似乎是一种可能的方法来实现这一点而不会有太多的麻烦。

答案 2 :(得分:1)

这是我如何拼凑实际有效的东西。我只是希望能够为那些为我的启蒙之路铺平道路的人提供信誉。

假设您的应用程序名为 Heckler 。将应用程序的命名空间标记添加到Window对象:

<Window ...
    xmlns:w="clr-namespace:Heckler" 
    ...>

现在添加CommandBindings属性标记并启动CommandBinding个对象的集合。在这里,我们添加自定义命令评论选择

<Window.CommandBindings>
    <CommandBinding
        Command="w:CustomCommands.CommentSelection"
        CanExecute="CommentSelectionCanExecute"
        Executed="CommentSelectionExecuted" />
</Window.CommandBindings>

MenuItem添加到主Menu的{​​{1}}:

MenuItem

<Menu IsMainMenu="True"> <MenuItem Header="_File"> <MenuItem Command="w:CustomCommands.CommentSelection"> </MenuItem> </MenuItem> </Menu> ... </Window> 代码隐藏中,添加 CustomCommands 类和自定义命令:

Window

现在连接您的事件处理程序:

public static class CustomCommands
{
    // Ctrl+Shift+C to avoid collision with Ctrl+C.
    public static readonly RoutedUICommand CommentSelection = 
        new RoutedUICommand("_Comment Selection", 
            "CommentSelection", typeof(MainWindow), 
            new InputGestureCollection() 
            { new KeyGesture(Key.C, (ModifierKeys.Control | ModifierKeys.Shift)) });
}

你应该好好去。我希望这有帮助,我没有错过任何东西!

答案 3 :(得分:-1)

<KeyBinding Command="{Binding ExitCommand}"

                Key="{Binding ExitCommand.GestureKey}"

                Modifiers="{Binding ExitCommand.GestureModifier}"/>
get

    {

        if (exitCommand == null)

        {

            exitCommand = new DelegateCommand(Exit);

            exitCommand.GestureKey = Key.X;

            exitCommand.GestureModifier = ModifierKeys.Control;

            exitCommand.MouseGesture = MouseAction.LeftDoubleClick;

        }

        return exitCommand;

    }

}
 private void Exit()
{
    Application.Current.Shutdown();
}