2016-09-15 7 views
0

WPF 응용 프로그램의 TextBox에서 키 조합을 잡으려고합니다. 단축키 명령 (Ctrl + C, Ctrl + V, Ctrl + X ...)에 연결된 조합을 제외하고 지금까지 작성한 코드 (다른 토론에서 찾은 코드)를 사용하면이 작업을 수행하는 데 도움이됩니다. 사용자가 텍스트 상자 (Space, Delete, Backspace 및 위의 모든 조합)를 누르는 모든 키를 찾으려고합니다.wpf의 텍스트 상자에서 단축키 명령을 비활성화하여 키 입력 감지를 유지합니다.

int MaxKeyCount = 3; 
List<Key> PressedKeys = new List<Key>(); 

private void TextBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Handled) return; 

     //Check all previous keys to see if they are still pressed 
     List<Key> KeysToRemove = new List<Key>(); 
     foreach (Key k in PressedKeys) 
     { 
      if (!Keyboard.IsKeyDown(k)) 
       KeysToRemove.Add(k); 
     } 

     //Remove all not pressed keys 
     foreach (Key k in KeysToRemove) 
      PressedKeys.Remove(k); 

     //Add the key if max count is not reached 
     if (PressedKeys.Count < MaxKeyCount) 
      //Add the key if it is part of the allowed keys 
      //if (AllowedKeys.Contains(e.Key)) 
      if (!PressedKeys.Contains(e.Key)) 
       PressedKeys.Add(e.Key); 

     PrintKeys(); 

     e.Handled = true; 
    } 

    private void PrintKeys() 
    { 
     //Print all pressed keys 
     string s = ""; 
     if (PressedKeys.Count == 0) return; 

     foreach (Key k in PressedKeys) 
      if (IsModifierKey(k)) 
       s += GetModifierKey(k) + " + "; 
      else 
       s += k + " + "; 

     s = s.Substring(0, s.Length - 3); 
     TextBox.Text = s; 
    } 

    private bool IsModifierKey(Key k) 
    { 
     if (k == Key.LeftCtrl || k == Key.RightCtrl || 
      k == Key.LeftShift || k == Key.RightShift || 
      k == Key.LeftAlt || k == Key.RightAlt || 
      k == Key.LWin || k == Key.RWin) 
      return true; 
     else 
      return false; 
    } 

    private ModifierKeys GetModifierKey(Key k) 
    { 
     if (k == Key.LeftCtrl || k == Key.RightCtrl) 
      return ModifierKeys.Control; 

     if (k == Key.LeftShift || k == Key.RightShift) 
      return ModifierKeys.Shift; 

     if (k == Key.LeftAlt || k == Key.RightAlt) 
      return ModifierKeys.Alt; 

     if (k == Key.LWin || k == Key.RWin) 
      return ModifierKeys.Windows; 

     return ModifierKeys.None; 
    } 

누군가가 키 입력을 유지, 비활성화 바로 가기 명령에 대한 아이디어가있다 : 이 코드인가? 감사합니다.

답변

1

해당 응용 프로그램 명령을 사용하여 사용자 지정 CommandBindings을 사용하여 재정의 할 수 있다고 생각합니다. 핸들러에서 ExecutedRoutedEventArgs.Handledtrue으로 설정하십시오.

기타 : 이는 사용성면에서 좋지 않습니다.


예 :

<TextBox> 
    <TextBox.CommandBindings> 
     <CommandBinding Command="Paste" Executed="CommandBinding_Executed"/> 
    </TextBox.CommandBindings> 
</TextBox> 
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    e.Handled = true; 
} 
+0

나는 아무 결과, 그것을 시도. – jonyballerino

+0

@jonyballerino : 핸들러에서'Handled'를'true'로 설정해야합니다. –

+0

@jonyballerino : 방금 요청한 내용을 기억하고 있습니다. –