2009-06-15 9 views
7

Ich habe CommandManager.RegisterClassInputBinding verwendet, um dem gesamten Typ eine Bindung hinzuzufügen. Jetzt möchte ich es entfernen.So entfernen Sie Eingabebindungen, die über den CommandManager hinzugefügt wurden.RegisterClassInputBinding?

Das habe ich getestet.

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

Diese Methode wird auf Ctrl genannt + H und registriert neue Eingabe Bindung für Ctrl + S. Wenn ich Strg drücken + S vor Ctrl +H es nicht funktioniert, aber wenn ich drücken, nachdem es der Fall ist.

Ich habe sender.InputBindings und es gab nur eine Bindung (Ctrl +S), damit ich festgestellt, dass RegisterClassInputBinding() nicht die Bindung an jede vorhandene Instanz nicht hinzufügen, sondern speichert Bindungen zu der Klasse zugeordnet ist, und vergleicht sie dann zu behandelte Geste.

Aber warum gibt es dann keine RemoveClassInputBinding() Methode? :(

bearbeiten


ich es sogar geschafft, zu tun, was ich durch Reflexion bestimmt, aber immer noch nicht native Methode dafür finden können, obwohl es trivial wäre zu implementieren.

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

Suchen Sie wie in Visual Studio Schlüssel Akkorde implementieren Wenn ja dieses? kann hilfreich sein: http://kent-boogaart.com/blog/multikeygesture – CodeNaked

Antwort

7

ApplicationCommands.NotACommand wurde genau für diesen Zweck entwickelt:

„T Sein Befehl wird immer ignoriert und behandelt nicht das Eingabeereignis, das ihn verursacht hat. Dies bietet eine Möglichkeit, eine Eingabe zu deaktivieren Bindung in eine bestehende Steuerung gebaut „

Ihr Beispiel verwenden:.

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

sieht sehr fehlerhaft zu mir.Ich schreibe Shortcuts-Manager, der Benutzer Eingabe Bindings hinzufügen/entfernen würde.Wie ich verstehe, wenn der Benutzer eine Bindung als entfernt Sie haben vorgeschlagen, dass die Bindung immer noch da ist und sie wird sich jedes Mal ansammeln, wenn der Benutzer das tut. Ist das korrekt? –

+0

Das weiß ich nicht genau, ich gebe nur den Rat weiter von Microsoft. Das kann ich dir sagen, aber Reflection ist sicherlich fehlerhaft. Ich werde durch Reflector gehen und sehen, ob MS Sonderfälle NotACommand. – user7116

+0

CommandManager.TranslateInput (interne Methode) Sonderfälle, um sicherzustellen, dass NotACommand nie ausgeführt wird: "if ((Befehl! = Null) && (Befehl! = ApplicationCommands.NotACommand))". – user7116

Verwandte Themen