【问题标题】:Custom RichTextBox OnKeyDown override doesn't work自定义 RichTextBox OnKeyDown 覆盖不起作用
【发布时间】:2016-03-03 19:06:04
【问题描述】:

我有这个类由 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 调用。

知道我该怎么做吗?

【问题讨论】:

  • 尝试使用e.handled = false;而不是抑制,以及keypress事件而不是keydown。
  • 它什么也没做。
  • @HansPassant 我同意这个建议,除了 AppendText 将从最后一个位置(而不是光标)添加文本。

标签: c# winforms richtextbox


【解决方案1】:
    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);
    }
}

【讨论】:

  • 谢谢,它是我将要编辑的编程内容的许多自动完成功能的基础。
【解决方案2】:

当使用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

【讨论】:

    猜你喜欢
    • 2011-08-13
    • 2018-01-30
    • 2012-06-10
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2015-02-12
    相关资源
    最近更新 更多