【问题标题】:RichTextBox Formatting is very slowRichTextBox 格式化很慢
【发布时间】:2016-10-17 00:04:17
【问题描述】:

我正在尝试制作一个简单的所见即所得编辑器。我发现格式化rtb非常困难。 它应该格式化基本的东西,如粗体、斜体、着色(和混合)。

到目前为止我发现和尝试了什么:

private void boldButton_Click(object sender, EventArgs e)
{
  int start = rtb.SelectionStart;
  int length = rtb.SelectionLength;

  for (int i = start, max = start + length; i < max; ++i)
  {
    rtb.Select(i, 1);
    rtb.SelectionFont = new Font(rtb.Font, rtb.SelectionFont.Style | FontStyle.Bold);
  }

  rtb.SelectionStart = start;
  rtb.SelectionLength = length;
  rtb.Focus();
}

rtb = 富文本框。

这按预期工作,但速度非常慢。 我也找到了直接使用和格式化 RTF 的想法,但是格式似乎太复杂而且很容易出错。 我希望这是一个更好的解决方案。

谢谢。

【问题讨论】:

  • 请定义“慢”,以及这种慢发生的位置。当你按下粗体按钮时,应用程序是否突然变得迟钝?
  • 使用 2^14 大约需要 2.4212091 秒。用 2^15 -> 4.973971 秒。对我来说似乎很慢。我的预期是
  • 您必须关闭绘图,直到您完成循环中的所有内容。见RichTextBox BeginUpdate() EndUpdate() Extension Methods Not Working
  • 为什么一次只格式化一个字符???整个循环是不必要的!删除它,只保留第二行!
  • 我在某处读到,如果字符混合了字体和样式,则一步将无法完成。但我从来没有为自己尝试过。谢谢你的回答,我明天试试。

标签: c# formatting richtextbox


【解决方案1】:

性能下降可能是因为您循环遍历每个角色,而不是一次性完成所有操作:

        var start = this.rtb.SelectionStart;
        var length = this.rtb.SelectionLength;

        this.rtb.Select(start, length);
        this.rtb.SelectionFont = new Font(this.rtb.Font, this.rtb.SelectionFont.Style | FontStyle.Bold);

【讨论】:

  • 但不适用于混合样式:(。至少不适合我。我做错了吗?
  • 从 Windows 的 dll 调用东西不是一种肮脏的把戏吗?谢谢。
【解决方案2】:

我自己也遇到过同样的问题。有趣的是,我发现如果在循环时避免引用控件的属性,可以将格式化速度提高一个数量级。相反,在进入循环之前将必要的控制属性放在单独的变量中。例如,而不是连续引用例如richTextBox1.Length,替换为int len = richTextBox1.Length,然后在循环内引用len。不是引用richTextBox1.Text[index],而是在循环之前替换为字符串text = richTextBox1.Text,然后在循环内替换为text[index]。

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多