2009-06-15 2 views
7

CommandManager.RegisterClassInputBinding을 사용하여 전체 유형에 바인딩을 추가했습니다. 이제 그걸 제거하고 싶습니다.CommandManager.RegisterClassInputBinding을 통해 추가 된 입력 바인딩을 제거하는 방법은 무엇입니까?

이것은 내가 테스트 한 것입니다.

private void CommandBinding_Executed_1(object sender, ExecutedRoutedEventArgs e) 
{ 
    CommandManager.RegisterClassInputBinding(
     typeof(TextBox), 
     new InputBinding(TestCommand, new KeyGesture(Key.S, ModifierKeys.Control))); 


    MessageBox.Show("CommandBinding_Executed_1"); 
} 

이 방법 + H Ctrl 키를 불러 Ctrl 키 S + 바인딩 새로운 입력을 등록한다. 내가 Ctrl 키 + H 전에 Ctrl 키 + S을 누르면 작동하지 않습니다, 그러나 그것은 수행 후 나는 그것을 누르면.

나는 sender.InputBindings을 확인하고 하나의 바인딩 (Ctrl 키 + S)가 있었다 그래서 나는 RegisterClassInputBinding() 모든 기존 인스턴스에 바인딩을 추가하지 않습니다 결론을 내렸다 대신 클래스에 관련된 바인딩을 저장하고 다음에 그들을 비교 제스처 취급.

그런데 왜 RemoveClassInputBinding() 방법이 없습니까? :(

편집


나는 심지어 구현하는 사소한 것이지만, 그것을위한 기본 방법을 찾을 수 없습니다 아직도 내가 반성을 통해 의도 할 나섰고.

var fieldInfo = typeof(CommandManager).GetField(
    "_classInputBindings", BindingFlags.Static | BindingFlags.NonPublic); 
var fieldData = (HybridDictionary)fieldInfo.GetValue(null); 
var inputBindingCollection = (InputBindingCollection)fieldData[typeof(TextBox)]; 
foreach (var o in inputBindingCollection) 
{ 
    if (o == inputBinding) 
    { 
     MessageBox.Show("half way there"); 
    } 
} 
inputBindingCollection.Remove(inputBinding); 
+0

당신이 그렇다면 Visual Studio에서 같은 키 코드를 구현하기 위해 찾고 계십니까이? 도움이 될 수 있습니다 : http://kent-boogaart.com/blog/multikeygesture – CodeNaked

답변

7

ApplicationCommands.NotACommand은 바로이 목적을 위해 설계되었습니다 :

"T 그의 명령은 항상 무시되며 그것을 일으킨 입력 이벤트를 처리하지 않습니다. 이것은 기존의 제어에 내장 된 바인딩 입력을 해제하는 방법을 제공합니다 "

은 예제를 사용하려면 :.,

CommandManager.RegisterClassInputBinding(
    typeof(TextBox), 
    new InputBinding(
     ApplicationCommands.NotACommand, 
     new KeyGesture(Key.S, ModifierKeys.Control))); 
+0

내게 매우 결함이 보인다. 사용자가 추가/입력 바인딩을 제거 할 수 있도록 바로 가기 관리자 쓰고 있어요. 사용자가 바인딩을 제거하면 이해합니다. 당신은 바인딩이 여전히 거기에있을 것을 제안했고, 사용자가 그것을 할 때마다 누적 될 것입니다.이게 맞습니까? –

+0

제가 확실히 모르겠다. 나는 조언을 따라 가고있다. Microsoft의 리플렉션을 사용하면 확실하게 결함이 있습니다. Reflector를 거쳐 MS 특수 사례 인 NotACommand가 있는지 살펴 보겠습니다. – user7116

+0

CommandManager.TranslateInput (내부 메서드) NotCommand가 실행되지 않도록하는 특별한 경우 : "if ((command! = null) && (command! = ApplicationCommands.NotACommand)))". – user7116

관련 문제