multi key gesture in wpf

前端 未结 4 1595
独厮守ぢ
独厮守ぢ 2020-12-21 05:55

I have a RoutedUICommand called Comment Selection. I need to add an input gesture for this command as it is in VIsual Studio, ie. (Ctrl+K

相关标签:
4条回答
  • 2020-12-21 06:09
    <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();
    }
    
    0 讨论(0)
  • 2020-12-21 06:15

    This code is made for "Ctrl+W, Ctrl+E" and/or "Ctrl+W, E" combinations, however you can parametrize it for any key combinations:

    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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-21 06:21

    Here's how I cobbled together something that actually works. I just wish I could credit the person or persons who paved the way to my Path of Enlightenment.

    Let's say your application is called Heckler. Add a namespace tag for your application to the Window object:

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

    Now add a CommandBindings property tag and start your collection of CommandBinding objects. Here we add custom command Comment Selection:

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

    Add a MenuItem to a main Menu's MenuItem:

        <Menu
            IsMainMenu="True">
            <MenuItem
                Header="_File">
                <MenuItem
                    Command="w:CustomCommands.CommentSelection">
                </MenuItem>
            </MenuItem>
        </Menu>
        ...
    </Window>
    

    In the Window code-behind, add your CustomCommands class and custom command:

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

    Now wire up your event handlers:

    private void CommentSelectionCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        // Determines status of command.
        e.CanExecute = true;
    }
    
    private void CommentSelectionExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        // TO-DO: Insert magic here.
    }
    

    You should be good to go. I hope this helps and I didn't miss anything!

    0 讨论(0)
  • 2020-12-21 06:31

    I've found this blog post which I think could be of help

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

    Basically, WPF has no built in support for it, but subclassing InputGesture or KeyGesture seems like a possible way to achieve this without too much hassle.

    0 讨论(0)
提交回复
热议问题