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