c# - WPF:如何从 TextBox 获取当前绝对行号和列号(忽略文本换行)
问题描述
我正在尝试获取 TextBox 中插入符号的行和列/字符的绝对位置(就像它在 Windows 记事本中实现的那样)。我知道TextBox.GetLineIndexFromCharacterIndex()
or TextBox.GetCharacterIndexFromLineIndex()
,但是这些方法返回相对位置(我的意思是这个方法计算换行的行数),例如,如果第一行换行到第二行,这个方法将返回第二行的索引,所以我需要另一个解决方案。我也尝试自己计算位置(使用循环遍历字符串),但是对于大量文本,它的工作速度非常慢。
解决方案
我认为没有任何方法可以在不以某种方式循环文本的情况下获得给定偏移量(字符)的行号。但是,有些方法会比其他方法更有效。
您可以从TextBox
控件本身中获得一些灵感,因为源代码可在此处免费获得:
https ://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/windows/Controls/TextBox.cs
无论如何都需要枚举每个TextBox
字符以显示文本。作为该过程的一部分,它还需要决定何时开始新生产线。为了使未来的计算更快,它保留了一个“行度量”的内部列表——基本上是每行从哪里开始以及每行有多长的列表。它使用这个内部列表来进行更高效的计算,GetCharacterIndexFromLineIndex
而GetLineIndexFromCharacterIndex
无需再次遍历每个字符。
你应该能够做类似的事情。在第一次加载时循环浏览背景中的文本,在开始时制作您自己的行位置列表,然后在进行更改时使该列表保持最新。
推荐阅读
- php - 我对 laravel 政策有疑问..它不起作用
- c# - 关于 oculus quest 光线投射
- ansible - 基于预定义清单创建 OpenStack 实例
- sharepoint-online - 在新选项卡中打开 Sharepoint 文档库链接
- r - 如何在 R 中创建阻塞的悬挂缩进报告格式(最好使用 gt)
- angular - Ionic 5 电子邮件反应式表单验证
- asp.net-mvc - 使用 .net 核心的 JWT Auth 令牌过期无法正常工作
- html - Flexbox 在缩小屏幕宽度时溢出屏幕
- list - 列表图块没有显示颤动中的所有数据?
- ruby-on-rails - 设计请求环境无