мультиключевой жест в wpf - PullRequest
       14

мультиключевой жест в wpf

4 голосов
/ 02 февраля 2010

У меня есть RoutedUICommand под названием Comment Selection. Мне нужно добавить жест ввода для этой команды, как в VIsual Studio, т.е. ( Ctrl + K , Ctrl + C ). Как я могу это сделать? Пожалуйста, помогите мне. (Помните о функциональности VS).

С уважением, Джавахар

Ответы [ 4 ]

3 голосов
/ 17 июля 2015

Этот код предназначен для комбинаций "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;
        }
    }
}
2 голосов
/ 22 июля 2010

Я нашел этот пост в блоге, который, я думаю, мог бы помочь

http://kent -boogaart.com / блог / multikeygesture

По сути, WPF не имеет встроенной поддержки для него, но создание подклассов InputGesture или KeyGesture кажется возможным способом добиться этого без особых хлопот.

1 голос
/ 12 декабря 2012

Вот как я собрал что-то, что действительно работает. Я просто хотел бы отдать должное человеку или людям, которые проложили путь к моему Пути Просветления .

Допустим, ваше приложение называется 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 MenuItem:

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

В коде Window добавьте класс CustomCommands и пользовательскую команду:

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

Теперь подключите ваши обработчики событий:

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.
}

Тебе должно быть хорошо идти. Надеюсь, это поможет, и я ничего не пропустил!

0 голосов
/ 03 октября 2012
<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();
}
...