2013-07-23 53 views
4

按规定我需要捕获两个字符和一个控制键(实施例(ALT + S + C)。 如何可以实现相同的按键组合的事件。组合键事件

由于 Ranish

+1

应该同时按下键还是应该按顺序(按住Alt,按下S然后按下C)? – Andy

+0

键同时 – Ranish

回答

0
<interactivity:EventTrigger EventName="KeyDown"> 
      <mvvmlight:EventToCommand Command="{Binding Command}" PassEventArgsToCommand="True" /> 
     </interactivity:EventTrigger> 




private void Event() 
{ 

    if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
    { 
        if (Keyboard.IsKeyDown(Key.C) && Keyboard.IsKeyDown(Key.T)) 
        { 
        //code 
        } 
    } 
} 
2

使用KeyDown事件:

if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) // Is Alt key pressed 
{ 
    if (Keyboard.IsKeyDown(Key.S) && Keyboard.IsKeyDown(Key.C)) 
    { 
     // do something here 
    } 
} 
0

如果你要绑定一个动作就该组合比你做,

<KeyBinding Gesture="Alt+S+C" Command="{Binding YourCommand}" /> 

看到这个msdn link

0

您可以检测使用下面的代码,

private void UIElement_OnPreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if (Keyboard.Modifiers == ModifierKeys.Alt && Keyboard.IsKeyDown(Key.S) 
      && Keyboard.IsKeyDown(Key.C)) 
     { 
      //if you want, you can fire event here 
     } 
    } 
3

编辑:修改后的代码。使用GestureKey属性是不可能的。最后声明的属性将用作密钥,并且Gesture属性中指定的密钥将被忽略。

下面的代码是唯一可能与2个ModifierKeys,而不是2个键:

<KeyBinding Gesture="Alt+Shift+C" Command="{Binding ACommand}"/> 

实现与2个键和一个ModifierKey下面的文章组合键看起来相当有用:

KeyGesture with Multiple Keys

+0

按下当我点击ALT + C组合,此命令发射 – Ranish

+0

感谢Ranish,好点。我修改了我的答案。 –

+0

我得到了另一种解决方案,请在下面找到它们 – Ranish

0

如果目的是让用户输入的字符序列与控制 键像评论/在Visual Studio中取消注释宏,那么你可以做这样的事情(TH是很粗糙的,它只是给你它是如何工作的一个想法)

增加一条按键它的窗上,并拥有手势来观看集合的自定义控件。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 
using System.Windows.Markup; 

namespace WpfApplication4 
{ 
    [ContentProperty("Gestures")] 
    public class KeyGestures : Control 
    { 
     public List<IKeyGesture> Gestures 
     { 
      get { return (List<IKeyGesture>)GetValue(GesturesProperty); } 
      set { SetValue(GesturesProperty, value); } 
     } 
     public static readonly DependencyProperty GesturesProperty = 
      DependencyProperty.Register("Gestures", typeof(List<IKeyGesture>), typeof(KeyGestures), new PropertyMetadata(null)); 

     public List<string> CurrentSequence 
     { 
      get { return (List<string>)GetValue(CurrentSequenceProperty); } 
      set { SetValue(CurrentSequenceProperty, value); } 
     } 
     public static readonly DependencyProperty CurrentSequenceProperty = 
      DependencyProperty.Register("CurrentSequence", typeof(List<string>), typeof(KeyGestures), new PropertyMetadata(null)); 

     public KeyGestures() 
     { 
      Gestures = new List<IKeyGesture>(); 
      CurrentSequence = new List<string>(); 
     } 

     protected override void OnInitialized(EventArgs e) 
     { 
      var hostWindow = Window.GetWindow(this); 
      if (hostWindow != null) 
      { 
       hostWindow.PreviewKeyDown += hostWinow_PreviewKeyDown; 
       hostWindow.PreviewKeyUp += hostWinow_PreviewKeyUp; 
      } 
      base.OnInitialized(e); 
     } 

     bool IsAnyKeyPressed() 
     { 
      var allPossibleKeys = Enum.GetValues(typeof(Key)); 
      bool results = false; 
      foreach (var currentKey in allPossibleKeys) 
      { 
       Key key = (Key)currentKey; 
       if (key != Key.None) 
        if (Keyboard.IsKeyDown((Key)currentKey)) { results = true; break; } 
      } 
      return results; 
     } 

     void hostWinow_PreviewKeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
     { 
      if (!IsAnyKeyPressed()) 
      { 
       CurrentSequence.Clear(); 
      } 
     } 

     void hostWinow_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
     { 
      if (e.SystemKey == Key.None) 
      { 
       if (!CurrentSequence.Contains(e.Key.ToString())) 
        CurrentSequence.Add(e.Key.ToString()); 
      } 
      else 
       if (!CurrentSequence.Contains(e.SystemKey.ToString())) 
        CurrentSequence.Add(e.SystemKey.ToString()); 

      foreach (var gesture in Gestures) 
       if (gesture.IsComplete(this.CurrentSequence)) 
       { 
        if (gesture.Command != null && gesture.Command.CanExecute(gesture.CommandParameter)) 
         gesture.Command.Execute(gesture.CommandParameter); 
        System.Diagnostics.Debug.WriteLine("Completed gesture " + gesture); 
       } 
     } 

    } 

    public interface IKeyGesture 
    { 
     bool IsComplete(List<string> currentSequence); 
     ICommand Command { get; } 
     object CommandParameter { get; set; } 
    } 

    public class SequenceKeyGesture : DependencyObject, IKeyGesture 
    { 
     public string Sequence { get; set; } 
     public char SplitChar { get; set; } 
     public ICommand Command { get; set; } 


     public object CommandParameter 
     { 
      get { return (object)GetValue(CommandParameterProperty); } 
      set { SetValue(CommandParameterProperty, value); } 
     } 
     public static readonly DependencyProperty CommandParameterProperty = 
      DependencyProperty.Register("CommandParameter", typeof(object), typeof(SequenceKeyGesture), new PropertyMetadata(null)); 


     public bool IsComplete(List<string> currentSequence) 
     { 

      string[] splitSequence = Sequence.Split(SplitChar); 
      if (splitSequence.Length != currentSequence.Count) return false; 
      if (splitSequence != null && splitSequence.Length > 0) 
       for (int i = 0; i < splitSequence.Length; i++) 
        if (splitSequence[i] != currentSequence[i]) 
         return false; 

      return true; 
     } 
     public SequenceKeyGesture() 
     { 
      SplitChar = '+'; 
     } 
     public override string ToString() 
     { 
      return Sequence; 
     } 
    } 
} 

然后可以用下面的XAML

<Window x:Class="WpfApplication4.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication4" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <local:KeyGestures> 
      <local:SequenceKeyGesture Sequence="LeftAlt~S~C" SplitChar="~" Command="{Command binding here}" CommandParameter="Action1" /> 
      <local:SequenceKeyGesture Sequence="LeftAlt+S+V" Command="{Command binding here" CommandParameter="Action2"/> 
     </local:KeyGestures> 
    </Grid> 
</Window> 

书中有一个的Debug.WriteLine向您展示手势时,你要测试的情况下被触发,而不必设置命令使用。