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

Ser*_*jev 7 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");
}
Run Code Online (Sandbox Code Playgroud)

这种方法被称为上Ctrl+ H并注册新的输入结合Ctrl+ S.如果我按Ctrl+ SCtrl+ 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);
Run Code Online (Sandbox Code Playgroud)

use*_*116 7

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

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

要使用您的示例:

CommandManager.RegisterClassInputBinding(
    typeof(TextBox),
    new InputBinding(
        ApplicationCommands.NotACommand,
        new KeyGesture(Key.S, ModifierKeys.Control)));
Run Code Online (Sandbox Code Playgroud)