7

我使用 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注册新的输入绑定。如果我在+之前按+它不起作用,但是当我在它之后按它时。CtrlSCtrlSCtrlH

我检查了一下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);
4

1 回答 1

8

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

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

要使用您的示例:

CommandManager.RegisterClassInputBinding(
    typeof(TextBox),
    new InputBinding(
        ApplicationCommands.NotACommand,
        new KeyGesture(Key.S, ModifierKeys.Control)));
于 2009-06-15T18:57:11.473 回答