【问题标题】:Converting tabs into spaces in a RichTextBox将制表符转换为 RichTextBox 中的空格
【发布时间】:2013-04-23 23:45:27
【问题描述】:

我有一个 WinForms 应用程序,在表单上有一个 RichTextBox 控件。现在,我将 AcceptsTabs 属性设置为 true,这样当 Tab 被点击时,它会插入一个制表符。

我想要做的是,当 Tab 被点击时,插入 4 个空格而不是 \t 制表符(我使用的是等宽字体)。我该怎么做?

【问题讨论】:

  • 使用控件上的按键事件来抑制'\t'并在其位置插入''。

标签: c# winforms richtextbox


【解决方案1】:

将 AcceptsTab 属性设置为 true,只需尝试使用 KeyPress 事件:

void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) {
  if (e.KeyChar == (char)Keys.Tab) {
    e.Handled = true;
    richTextBox1.SelectedText = new string(' ', 4);
  }
}

根据您的 cmets 关于添加最多每四个字符的空格,您可以尝试以下操作:

void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) {
  if (e.KeyChar == (char)Keys.Tab) {
    e.Handled = true;
    int numSpaces = 4 - ((richTextBox1.SelectionStart - richTextBox1.GetFirstCharIndexOfCurrentLine()) % 4);
    richTextBox1.SelectedText = new string(' ', numSpaces);

  }
}

【讨论】:

  • 比我的更好的解决方案,但AppendText 不是解决方法。如果插入符号的位置与末尾不同怎么办?不过,您可以从我的回答中获取 sn-p!
  • @DannyBeckett 并没有完全考虑清楚。已更新。
  • 还有一件事。 richTextBox1.SelectionLength = 0; 也是必需的...如果用户突出显示了某些内容怎么办? ;)
  • @DannyBeckett 应该不是问题。如果在具有 AcceptsTab=True 的普通 RTB 中突出显示某些内容并且您按下 tab 键,则所选文本将替换为 tab。
【解决方案2】:

添加一个新类来覆盖您的RichTextBox

class MyRichTextBox : RichTextBox
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if(keyData == Keys.Tab)
        {
            SelectionLength = 0;
            SelectedText = new string(' ', 4);
            return true;
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
}

然后您可以将新控件拖到表单的设计视图中:

注意:与@LarsTec 的回答不同,此处不需要设置AcceptsTab

【讨论】:

  • 这个解决方案效果很好,但是有没有办法让它像标签一样“行动”?这意味着如果我键入两个字符,然后按制表符,普通制表符只会将其移动 2 个空格。如果我再次点击制表符,它会移动 4 个空格。您的解决方案使其始终插入 4 个空格。你明白我的意思吗?
  • 这几乎就像我需要取行的长度,以 4 为模,然后添加那么多空格,而不是总是添加 4
  • 如何获得当前行的长度?例如。光标所在行的长度?
  • 再想一想,其实我只需要获取到光标位置的线条长度即可。不是整行长度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2013-12-12
  • 2016-08-17
  • 2014-04-27
  • 2013-01-24
  • 2012-08-02
相关资源
最近更新 更多