【问题标题】:WPF: How to get current absolute line and column numbers from TextBox (ignoring text wrapping)WPF:如何从 TextBox 获取当前绝对行号和列号(忽略文本换行)
【发布时间】:2020-05-21 22:56:23
【问题描述】:

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

Text without wrapping Text with wrapping

【问题讨论】:

  • 出于好奇,用例是什么?为什么你需要知道一个不换行的字符在一个换行的文本框中的位置?
  • @KeithStein 我正在创建类似于 Windows 记事本应用程序(在 WPF 上)的东西,它支持插件和样式化,我需要创建一个包含有关文本框的所有主要信息的状态栏。
  • @KeithStein 你可以在这里观看简单的演示:gifyu.com/image/n5Dx

标签: c# .net wpf wpf-controls


【解决方案1】:

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

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

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

你应该能够做类似的事情。通过在首次加载文本时在后台循环文本,在开始时创建自己的行位置列表,然后在进行更改时使该列表保持最新。

【讨论】:

    猜你喜欢
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2021-06-04
    相关资源
    最近更新 更多