【问题标题】:Remove or modify the default key gestures of standard commands移除或修改标准命令的默认按键手势
【发布时间】:2011-04-02 03:17:47
【问题描述】:

我需要删除(或至少更改)与 wpf 标准命令关联的默认手势。

这是我的问题:

我有一个 Datagrid(来自 infragistics 的 XamDataGrid),我已将我创建的自定义命令关联到该数据网格。该命令使用“ctrl-delete”手势。
只要我不编辑单元格的值,它就可以工作。

当我编辑单元格时,会使用 TextEditor。当我使用“ctrl-delete”手势时,不是执行我的命令,而是执行 DeleteNextWord 命令。
这很正常,TextEditor 有焦点,并且由于没有绑定或附加输入手势,所以使用类。

这就是我的问题所在。我不能(没有矫枉过正)向该 TextEditor 实例添加绑定或输入手势。

所以我尝试使用的方法是删除或修改 DeleteNextWord 命令的“默认”键手势。

在使用 .Net Reflector 了解命令的注册方式后,我看到框架从资源中获取与命令关联的键。

在我的例子中,手势“ctrl-delete”来自资源“ExceptionStringTable”(内部类型 SR,静态构造函数)中的键“KeyDeleteNextWord”。

所以我的问题:

我可以覆盖资源“ExceptionStringTable”中“KeyDeleteNextWord”的值吗?

或者,以更一般的方式:

如何全局修改标准 WPF 命令的默认手势?

如果需要,我很乐意提供更多信息。

谢谢。

【问题讨论】:

    标签: .net wpf command


    【解决方案1】:

    我没有 XamDataGrid,但我尝试使用常规 TextBox。

    tb.PreviewKeyDown += new KeyEventHandler(tb_KeyDown);
    void tb_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.X && Keyboard.Modifiers == ModifierKeys.Control)
            {
                Trace.WriteLine("Ctrl+X");
                e.Handled = true;
            }
        }
    

    该代码将绕过默认的“剪切”命令。

    在您的项目中,您可能需要修改控件模板,然后使用 TextEditor 上的附加属性或行为来拦截击键并发送您自己的命令。

    【讨论】:

    • 即使它有效,我也不喜欢必须添加代码来阻止命令执行的想法。此外,我需要访问文本框才能将处理程序添加到事件中,这就是问题所在。我无法(轻松)访问嵌入到网格单元格中的文本框。难道没有更干净的方法来删除或修改类绑定或类手势吗?
    • @Cerel,正如我所说,使用附加属性或行为,这是在没有源代码时扩展控件的典型方式。而且我不知道您为什么反对编写代码。为了实现这一目标,您还想做什么?
    • 首先我创建了从 PreviewKeyDown 事件中删除代码的命令......我无法轻松访问文本框,因此我无法将任何内容附加到它们。如果我可以轻松访问,我已经将输入绑定添加到我的命令或“NotACommand”。没有办法更新现有的资源字符串吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多