- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在从事语法高亮和代码完成项目,并基于 RichTextBox 制作用户控件。我在适应 RTB 的工作方式和所有方面时遇到了一些问题,但我设法进行了简单的语法突出显示。
简单意味着每次用户键入一个字符时,我都会突出显示整个文本。它不应该很快或任何东西,但它太慢。当我有大约 500 个字符的文本时,性能问题变得明显,并且我只为每个键入的字符执行一次文本(“colorInterval”函数在一次通过中被调用大约 100 次)。
性能分析表明问题是 TextRange 构造函数占用了大约 80% 以上的时间,每次我需要为文本间隔着色时我都会使用它:
private void colorInterval(TextPointer start, TextPointer end)
{
TextRange range = new TextRange(start, end);
if(isFunction(range.Text)) colorAsFunction(range);
if(isInQuotes(range.Text)) colorAsQuoted(range);
...
}
我的问题:
我这样做是不是做错了什么,或者有没有办法提高 TextRange 的性能,回收“范围”对象或类似的东西?还有哪些其他解决方案。
最佳答案
最简单的方法是(如您所建议的那样)重用 TextRange
对象,如果它确实是占用您大部分时间的构造函数的话。 TextRange
属性 Start
和 End
是只读的,但是有一个公共(public)方法 Select
可以更新两者,使用两个 TextPointer
对象,就像您一直在使用的构造函数一样。
protected TextRange range;
private void colorInterval(TextPointer start, TextPointer end)
{
if (range == null)
range = new TextRange(start, end);
else
range.Select(start, end);
...
}
(注意,在决定是否初始化变量之前检查空引用并不像在声明中实例化一个 TextRange
那样整洁。不幸的是,TextRange
没有公共(public)空构造函数和 TextPointer
根本没有公共(public)构造函数。您可以在类构造函数中使用一些虚拟值来创建它以避免此检查。)
上面,我说了'如果它真的是构造函数'。显然,您正确完成的分析已经突出显示了构造函数,但它可以很容易地成为构造函数和 Select
方法共有的例程。
假设您不从多个线程调用 colorInterval
,我会说这是一种比您目前节省的时间更好的方法,因为(我猜) colorInterval
被频繁调用,不断创建和垃圾收集它留下的后续 TextRange
对象肯定是低效率的。
提出这个建议后,我强烈建议您放弃每次要对(例如)单个字符更改使用react时扫描整个文档的模型。假设您的目标是 >= .net 3.5,RichTextBox
提供了一个 TextChanged
事件,该事件报告了一个 TextChange
对象列表,您可以从中计算出位置(以及添加或删除的字符)更改。
当然,这里会有一些工作,因为任何更改都不太可能完全封装突出显示的范围。 TextRange
类有一个方法可以找到可以找到范围开始和结束的段落,以防有帮助。可能需要存储每个突出显示范围的详细信息,以便您可以快速检查交叉点。
关于c# - RichTextBox 中的 TextRange 构造函数性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11648272/
我对 RichTextBox 控件感到困惑。 我的 WinForm 有一个 RichTextBox 控件,宽度为 100px。我想动态创建一个然后引用实例。 因此,假设在我的 Form 上我有一个名为
MouseDown 事件处理程序的 KeyDown 事件处理程序中 e.Handled = true 的等价物是什么?我不希望鼠标事件对 RichTextBox 有任何影响(完全禁用鼠标与 RichT
我有一个 richtextbox,它的文本是特定表格中一些单词的串联。 (表格列是'word','translate'和'id') 我需要当用户将鼠标悬停在每个单词上时,相关的翻译会显示在单词的工具提
您好,我在将 richtextbox 中的数据显示或传输到其他 richtextbox 时遇到问题... richtextbox1.Document = richtextbox2.Document;
我正尝试在我的 Windows Phone 8 应用程序中使用 RichTextBox。用户需要能够选择文本并将其复制到剪贴板。用户不需要编辑文本,只需选择它。但是,我似乎无法在 Windows Ph
我有一个 Winforms 项目,我可以在其中将文本写入 RichTextBox,还有一些控件可以设置所写文本的字体格式。我能够将文本保存并附加到 RTF 文件,但我在保留每个 RichTextBox
假设我有以下内容:
我需要一些具有富文本编辑功能的基本 CMS 功能。在 stack overflow 上有一个常规的文本区域编辑控件,支持 Markdown 样式语法格式。那将超出我的用户范围,所以我想要一个类似丰富的
显示图像: 复制代码代码如下: Image img = Image.FromFi
我遇到过 RichTextBox 的一些奇怪行为。我希望它是readonly,但是当我使用时它不显示图像richTextBox.LoadFile(path) 方法加载.rtf 文件。当它不是reado
我需要将 ScrollBars 设置为 ForcedBoth 但我还想知道 ScrollBars 的句柄何时可见并且用户可以滚动。 两个滚动条的 bool 值都可以 这里用户不能滚动: 在这里他们可以
我正在开发根据正则表达式模式在 RichTextBox 中突出显示文本的应用程序。 它工作正常,除了性能,即使对于小文本(大约 500 个字符),它也会挂起一段时间,这对用户是可见的。 我在 Flow
我在我的 WPF richtextbox 上启用了拼写,我想在显示带有拼写建议的上下文菜单之前在当前插入符号位置获取拼写错误的单词。 最佳答案 新方式 void richTextBox1_Pr
我在 .NET Windows 窗体应用程序中使用 RichTextBox 控件。我允许用户在文本框本身内按 TAB 键。但是,当我将 .Text 值保存在文本框中时,它将显示如下: "This[]i
我在 MS Word 中创建了带有超链接的 rtf 文件并将其加载到 RichTextBox 中。 RichTextBox 中的超链接不起作用。 RichTextBox 和 MS Word 使用不同的
有没有办法改变 RichTextBox 中下划线的颜色? ? 我试过 this但它似乎不起作用。有人知道这些枚举值是从哪里来的吗?没有看到它的任何文档。 谢谢。 最佳答案 枚举值是将消息传递给控件时的
这是交易:我有一个 RichTextBox 控件,它工作正常。问题是有一个“插入当前日期时间”按钮,它将当前日期时间添加/注入(inject)到 RichTextBox 中。用户可以在插入符号指向的任
我正在编写一个小应用程序,我可以在其中加载文本文件以匹配正则表达式: 我根据匹配行的长度更改前景色文本, 问题是,如果一行是多行,那么它不会按预期工作并且只选择该行的一半,例如以“title”开头的第
我有一个 RichTextBox在我的应用程序中,它正在获取有关某些事件的新内容。 添加新内容时,我想滚动到底部,仅当 卷轴在底部 之前 . 我该怎么做呢? 更具体地说,给我带来麻烦的部分是确定滚动位
当加载 50KB 的文本文档时,WPF 的 RichTextBox 控件的性能确实很慢。滚动滞后并按 Ctrl-A 选择所有文本需要 10 多秒钟。 (这在记事本上是瞬时的)。 我没有做任何花哨的位图
我是一名优秀的程序员,十分优秀!