使用 WPF RichTextBox 创建带有行号的编辑器

17

我正在为特定领域语言创建一个文本编辑器。我使用 WPF RichTextBox 作为基本控件。我不知道如何优雅地包括行号。有人知道任何示例吗?


我不够聪明,无法让它工作。我一直没能弄清楚RichTextBox何时滚动,以便我可以尝试将ListBox滚动相同的量。随着RTB中的行变得过长,它会自动换行显示,这种情况下我应该省略ListBox行号。 - John Alden
4个回答

7

AvalonEdit是一个很好的开源控件,几乎具备Aqistar控件的所有功能,如语法高亮和折叠。易于配置和使用。更多详细信息可以在这里找到。 输入图像描述


3
我会创建一个组合控件,其中包含一个堆栈面板控件和左侧的文本块,用于处理行号。如果您担心行数过多导致有太多的可视元素,则可以使用虚拟模式下的ListBox。
您需要连接到RichTextBox上的各种事件,以便知道何时更新ListBox,以及计算每行的高度,但是这应该可以通过附加到RichTextBox的FlowDocument来完成。

我不确定我是否喜欢这个想法 - 保持列表框文本基线与RichEdit基线一致可能会有问题(如果他的代码格式化程序允许使用不同的字体,那就肯定会有问题)- 但由于我没有其他选择,所以+1。 - Frank Krueger
我不够聪明让它工作。我一直无法弄清楚RichTextBox何时滚动,以便我可以尝试将ListBox滚动同样的量。而且,随着RTB中的行变得过长,它会自动换行显示,此时我应该忽略ListBox行号。 - John Alden

3
RichText支持“保护”-不可编辑-跨度。您可以将行号作为受保护的文本跨度转储为RTF流的一部分(当您进行格式化时)。
在Win Forms中,您可以使用RichTextBox.SelectionProtected Property。WPF必须有类似的东西。
这样,所有基线都将正确,您就不必做任何额外的思考/编程来使编辑器正常工作。可编辑文本将是可编辑的,行号将不会。
唯一的缺点是您必须在每次编辑后重新提交RTF流。但我想您已经在这样做以提供解析格式/错误诊断/任何其他内容。

2
使用AqiStar的富文本WPF控件怎么样? AqiStar.TextBox 我并不是他们的员工...我只是知道Oren在他的NHibernate Profiler (NHProf)中使用了这个产品,而且他似乎很喜欢它。

很遗憾,我的雇主不允许我们在解决方案中包含需要许可的软件。 - John Alden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接