自定义 RichTextBox OnKeyDown 覆盖不起作用

本文关键字:不起作用 覆盖 OnKeyDown RichTextBox 自定义 | 更新日期: 2023-09-27 18:37:07

我有这个类被RichTextBox继承。我覆盖了 void OnKeyDown来检查传入的选项卡,因为我不想要它们。

使用断点,我看到被覆盖的 void 被调用,但它没有完成它的工作。

这是代码:

class ProgrammingTextBox : RichTextBox
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Tab)
        {
            // Tab was pressed, replace it with space
            e.SuppressKeyPress = true; // Don't press Tab
            for (int i = 0; i < 4; i++)
            {
                base.OnKeyDown(new KeyEventArgs(Keys.Space); // Repeat space 4 times
            }
        }
        else base.OnKeyDown(e);
    }
}

所需的输出应该是具有 4 个空格的文本,但结果为 Tab,例如未调用来自 for 循环的OnKeyDown调用。

知道我该怎么办吗?

自定义 RichTextBox OnKeyDown 覆盖不起作用

    base.OnKeyDown(new KeyEventArgs(Keys.Space);

OnKeyPress() 上的 OnKeyDown() 只生成通知,它们的工作不是修改 Text 属性。 这取决于你,分配 SelectedText 属性。 喜欢这个:

class ProgrammingTextBox : RichTextBox {
    protected override bool IsInputKey(Keys keyData) {
        if (keyData == Keys.Tab) return true;
        return base.IsInputKey(keyData);
    }
    protected override void OnKeyDown(KeyEventArgs e) {
        if (e.KeyCode == Keys.Tab) {
            const string tabtospaces = "    ";
            var hassel = this.SelectionLength > 0;
            this.SelectedText = tabtospaces;
            if (!hassel) this.SelectionStart += tabtospaces.Length;
            e.SuppressKeyPress = true;
        }
        else base.OnKeyDown(e);
    }
}

当使用 Tab 时(这不是一个普通的键 - 它可以,比如说,它可以被预处理并移动焦点控制),你必须覆盖不同的方法,ProcessCmdKey

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.110).aspx

像这样的东西

   protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
     if (keyData == Keys.Tab) {
       //TODO: Your code here
       return true;
     }
     return base.ProcessCmdKey(ref msg, keyData);
   }

参见

https://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.acceptstab.aspx