WPF:如何从TextBox中获取当前的绝对行数和列数(忽略文本换行)

问题描述 投票:-2回答:1

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

Text without wrappingText with wrapping

c# .net wpf wpf-controls
1个回答
0
投票

我认为您没有任何方式可以获取给定偏移量(字符)的行号而无需以某种方式遍历文本。但是,某些方法将比其他方法更有效。

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

TextBox无论如何都需要枚举每个字符才能显示文本。作为该过程的一部分,还需要确定何时开始新行。为了使以后的计算更快,它保留了“行指标”的内部列表-基本上是每行的起点和行长的列表。它使用此内部列表来更有效地执行GetCharacterIndexFromLineIndexGetLineIndexFromCharacterIndex之类的计算,而不必再次遍历每个字符。

您应该能够执行类似的操作。首先,通过在第一次加载时在后台循环浏览文本来创建自己的行位置列表,然后在进行更改时使该列表保持最新状态。

© www.soinside.com 2019 - 2024. All rights reserved.