Я использовал 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");
}
Этот метод вызывается для Ctrl + H и регистрирует новую привязку ввода для Ctrl + S . Если я нажимаю Ctrl + S до Ctrl + H , это не работает, но когда я нажимаю его после этого.
Я проверил 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);