如何删除通过CommandManager.RegisterClassInputBinding添加的输入绑定?

时间:2009-06-15 18:20:49

标签: c# wpf inputbinding

我使用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 + H 之前按 Ctrl + S 它不起作用,但是当我按下它之后确实如此。

我检查了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 个答案:

答案 0 :(得分:7)

ApplicationCommands.NotACommand就是为此而设计的:

  

“此命令始终被忽略,并且不处理导致它的输入事件。这提供了一种关闭内置于现有控件中的输入绑定的方法。”

使用您的示例:

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