gpt4 book ai didi

c# - 如何删除通过 CommandManager.RegisterClassInputBinding 添加的输入绑定(bind)?

转载 作者:太空狗 更新时间:2023-10-29 20:22:38 26 4
gpt4 key购买 nike

我使用 CommandManager.RegisterClassInputBinding 将绑定(bind)添加到整个类型。现在我想删除它。

这是我测试过的。

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 注册新的输入绑定(bind)。如果我在 Ctrl+H 之前按 Ctrl+S 它不起作用,但是当我在之后按它时确实如此。

我检查了 sender.InputBindings 并且只有一个绑定(bind) (Ctrl+S) 所以我得出结论 RegisterClassInputBinding() 不会将绑定(bind)添加到每个现有实例,而是存储与类关联的绑定(bind),然后将它们与处理的手势进行比较。

但是为什么没有 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);

最佳答案

ApplicationCommands.NotACommand专为这个目的而设计:

"This command is always ignored and does not handle the input event that caused it. This provides a way to turn off an input binding built into an existing control."

使用你的例子:

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

关于c# - 如何删除通过 CommandManager.RegisterClassInputBinding 添加的输入绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/997558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com