2010-02-02 2 views
3

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

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

ответ

2

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

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

В принципе, МОФ нет встроенной поддержки для этого, но подклассов InputGesture или KeyGesture похоже, является возможным способом достижения этого без особых хлопот.

-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(); 
} 
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 «s 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. 
} 

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

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; 
     } 
    } 
} 
Смежные вопросы