2009-06-15 5 views
7

J'ai utilisé CommandManager.RegisterClassInputBinding pour ajouter une liaison au type entier. Maintenant, je veux l'enlever.Comment supprimer la liaison d'entrée ajoutée via CommandManager.RegisterClassInputBinding?

C'est ce que j'ai testé.

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

Cette méthode est appelée sur Ctrl + H et enregistre une nouvelle entrée de liaison pour Ctrl + S . Si je presse Ctrl +S avant Ctrl +H cela ne fonctionne pas, mais quand je presse après qu'il fait.

j'ai vérifié sender.InputBindings et il n'y avait qu'une seule fixation (Ctrl +S) donc je conclus que RegisterClassInputBinding() n'ajoute la liaison à tous les cas existants, mais les liaisons stocke plutôt associés à la classe, puis les compare à geste manipulé.

Mais alors pourquoi il n'y a pas de méthode RemoveClassInputBinding()? :(

Modifier


J'ai même réussi à faire ce que je voulais à travers la réflexion, mais ne peut pas trouver la méthode native pour cela, bien qu'il serait trivial à mettre en œuvre.

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

Vous cherchez à mettre en œuvre des accords clés comme dans Visual Studio Si oui, cela? peut être utile: http://kent-boogaart.com/blog/multikeygesture – CodeNaked

Répondre

7

ApplicationCommands.NotACommand a été conçu uniquement dans ce but:

« T Sa commande est toujours ignorée et ne gère pas l'événement d'entrée qui l'a provoquée. Cela fournit un moyen de désactiver une entrée de liaison intégrée dans un contrôle existant «

Pour utiliser votre exemple.

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

me semble très imparfait.J'écris gestionnaire de raccourcis qui permettrait à l'utilisateur d'ajouter/supprimer des liaisons d'entrée.Si je comprends si l'utilisateur supprime une liaison comme vous avez suggéré que la reliure sera toujours là et qu'elle s'accumulera à chaque fois que l'utilisateur le fera.C'est exact? –

+0

Je ne sais pas à coup sûr, je ne fais que passer le conseil de Microsoft. Je peux vous dire cela bien, en utilisant Reflection est sûrement défectueux. Je vais passer par réflecteur et voir si MS cas particuliers NotACommand. – user7116

+0

CommandManager.TranslateInput (méthode interne) cas spéciaux pour s'assurer que NotAcommand n'est jamais exécuté: "if ((commande! = Null) && (commande! = ApplicationCommands.NotACommand))". – user7116

Questions connexes