我正在尝试获取TextBox中插入符号的行和列/字符的绝对位置(就像在Windows记事本中实现的那样)。我知道TextBox.GetLineIndexFromCharacterIndex()
或TextBox.GetCharacterIndexFromLineIndex()
,但是这些方法返回相对位置(我的意思是该方法计算换行),例如,如果第一行换行到第二行,则此方法将返回第二行的索引,所以我需要另一个解决方案。我也尝试过自己计算位置(使用通过字符串的循环),但是文本量很大,它的运行速度非常慢。
我认为您没有任何方式可以获取给定偏移量(字符)的行号而无需以某种方式遍历文本。但是,某些方法将比其他方法更有效。
您可以从TextBox
控件本身获得一些启发,因为源代码可在此处免费获得:https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/windows/Controls/TextBox.cs
TextBox
无论如何都需要枚举每个字符才能显示文本。作为该过程的一部分,还需要确定何时开始新行。为了使以后的计算更快,它保留了“行指标”的内部列表-基本上是每行的起点和行长的列表。它使用此内部列表来更有效地执行GetCharacterIndexFromLineIndex
和GetLineIndexFromCharacterIndex
之类的计算,而不必再次遍历每个字符。
您应该能够执行类似的操作。首先,通过在第一次加载时在后台循环浏览文本来创建自己的行位置列表,然后在进行更改时使该列表保持最新状态。