我有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键形式显示,例如未调用OnKeyDown循环中的for调用。

知道该怎么办吗?

最佳答案

    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);
    }
}

关于c# - 自定义RichTextBox OnKeyDown覆盖无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35769617/

10-11 18:59