我会创建一个组合控件,其中包含一个堆栈面板控件和左侧的文本块,用于处理行号。如果您担心行数过多导致有太多的可视元素,则可以使用虚拟模式下的ListBox。您需要连接到RichTextBox上的各种事件,以便知道何时更新ListBox,以及计算每行的高度,但是这应该可以通过附加到RichTextBox的FlowDocument来完成。
RichText支持“保护”-不可编辑-跨度。您可以将行号作为受保护的文本跨度转储为RTF流的一部分(当您进行格式化时)。在Win Forms中,您可以使用RichTextBox.SelectionProtected Property。WPF必须有类似的东西。这样,所有基线都将正确,您就不必做任何额外的思考/编程来使编辑器正常工作。可编辑文本将是可编辑的,行号将不会。唯一的缺点是您必须在每次编辑后重新提交RTF流。但我想您已经在这样做以提供解析格式/错误诊断/任何其他内容。
使用AqiStar的富文本WPF控件怎么样? AqiStar.TextBox 我并不是他们的员工...我只是知道Oren在他的NHibernate Profiler (NHProf)中使用了这个产品,而且他似乎很喜欢它。