如何在WPF TextBox中禁用快捷键

6
我希望禁用WPF TextBox中的所有默认快捷键,例如Ctrl + ACtrl + VCtrl + C等。这是否可行?在我看来,这些快捷键似乎是在KeyDown事件之前执行的。

因为我正在做一个控件,允许用户指定任何快捷键来执行某些操作。当然,我不需要在Ctrl+A上选择所有内容,而是只需显示它即可。 - Sergej Andrejev
啊,我本来以为WPF已经提供了一个类似的控件。谢谢你提供的信息。 - Hank Gay
1
应更新InputBinding以使用ApplicationCommands.NotACommand来禁用它们:http://msdn.microsoft.com/en-us/library/system.windows.input.applicationcommands.notacommand.aspx - user7116
2个回答

3
public Window1()
{
    InitializeComponent();
    CommandManager.AddPreviewCanExecuteHandler(_textBox, _canExecute);
}

private void _canExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = false;
    e.Handled = true;
}

上述代码将防止文本框声称它可以处理任何命令。您可以通过检查EventArgs来有选择性地选择要禁用的命令。或者您也可以在XAML中完成此操作:

<TextBox x:Name="_textBox">
    <TextBox.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Copy" CanExecute="_canExecute"/>
    </TextBox.CommandBindings>
</TextBox>

在这里,我们只是禁用了复制命令的执行。 Control-C将不起作用,上下文菜单或主菜单也是如此。实际上,如果焦点在 TextBox 中,任何执行复制命令的控件都将被禁用。


3
您可以在“PreviewKeyDown”事件中拦截按键。将“e.Handled”成员设置为“true”,这将防止实际处理按键。

谢谢。说得很到位。以前从未见过这个预览事件。 - Sergej Andrejev
这只适用于按键输入。如果命令是通过上下文菜单或应用程序菜单调用的呢? - Kent Boogaart
@Kent,我相信这是通过WPF命令完成的。我对它们的实现非常不熟悉,无法提供任何有用的评论来说明它是如何工作的。虽然我很想看到有人这样做。 - JaredPar
@Jared:你的方法防止了输入绑定调用命令,但还有其他执行命令的方式。无论如何,不太清楚OP是想完全禁用命令还是只是禁用按键来调用命令。 - Kent Boogaart
2
应更新InputBinding以使用ApplicationCommands.NotACommand来禁用它们。 - user7116

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接