我有一个Winforms对话框,其中包含一个控件以及一个允许单行输入的TextBox。我希望用户可以按Ctrl-Backspace删除整个单词。这不是开箱即用的TextBox的默认行为。我得到一个矩形字符,而不是删除单词。

我已经确认ShortcutsEnabled属性设置为True

我确实发现我可以使用RichTextBox而不是TextBox来获得所需的行为。这样做的问题是RichTextBox(特别是边框)的外观与TextBox的外观不同,并且我不需要或不需要标记文本的功能。

所以我的问题是如何最好地处理这种情况?我缺少TextBox上的某些属性吗?还是最好使用RichTextBox,更新外观使其一致,并禁用文本标记?

如果没有更好的方法,我比较高兴地编写代码来显式地处理KeyDown和KeyPress事件,但是我认为值得首先进行检查。

最佳答案

/*更新2:请查看https://positivetinker.com/adding-ctrl-a-and-ctrl-backspace-support-to-the-winforms-textbox-control,因为它可以解决我的简单解决方案中的所有问题*/
/*更新1:请同时查看以下达米尔的答案,这可能是一个更好的解决方案:) */
我可以通过向文本框发送Ctrl + Shift + Left和Backspace来模拟Ctrl + Backspace。效果实际上是相同的,并且不需要手动处理控件的文本。您可以使用以下代码来实现:

class TextBoxEx : TextBox
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.Back))
        {
            SendKeys.SendWait("^+{LEFT}{BACKSPACE}");
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}
您还可以修改app.config文件,以强制SendKey类使用更新的发送 key 方法:
<configuration>
  <appSettings>
    <add key="SendKeys" value="SendInput" />
  </appSettings>
</configuration>

关于c# - Winforms文本框-使用Ctrl-Backspace删除整个单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1124639/

10-12 12:43
查看更多