首页 > 解决方案 > WPF:如何从 TextBox 获取当前绝对行号和列号(忽略文本换行)

问题描述

我正在尝试获取 TextBox 中插入符号的行和列/字符的绝对位置(就像它在 Windows 记事本中实现的那样)。我知道TextBox.GetLineIndexFromCharacterIndex()or TextBox.GetCharacterIndexFromLineIndex(),但是这些方法返回相对位置(我的意思是这个方法计算换行的行数),例如,如果第一行换行到第二行,这个方法将返回第二行的索引,所以我需要另一个解决方案。我也尝试自己计算位置(使用循环遍历字符串),但是对于大量文本,它的工作速度非常慢。

没有换行 的文本 有换行的文本

标签: c#.netwpfwpf-controls

解决方案


我认为没有任何方法可以在不以某种方式循环文本的情况下获得给定偏移量(字符)的行号。但是,有些方法会比其他方法更有效。

您可以从TextBox控件本身中获得一些灵感,因为源代码可在此处免费获得:
https ://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/windows/Controls/TextBox.cs

无论如何都需要枚举每个TextBox字符以显示文本。作为该过程的一部分,它还需要决定何时开始新生产线。为了使未来的计算更快,它保留了一个“行度量”的内部列表——基本上是每行从哪里开始以及每行有多长的列表。它使用这个内部列表来进行更高效的计算,GetCharacterIndexFromLineIndexGetLineIndexFromCharacterIndex无需再次遍历每个字符。

你应该能够做类似的事情。在第一次加载时循环浏览背景中的文本,在开始时制作您自己的行位置列表,然后在进行更改时使该列表保持最新。


推荐阅读