Как удалить привязку ввода, добавленную через CommandManager.RegisterClassInputBinding? - PullRequest
7 голосов
/ 15 июня 2009

Я использовал 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);

1 Ответ

7 голосов
/ 15 июня 2009

ApplicationCommands.NotACommand был разработан именно для этой цели:

"Эта команда всегда игнорируется и не обрабатывает событие ввода, вызвавшее ее. Это позволяет отключить привязку ввода, встроенную в существующий элемент управления."

Чтобы использовать ваш пример:

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