如何为WPF TextBox控件实现RichTextBox的GetLineStartPosition API
为WPF TextBox实现RichTextBox风格的GetLineStartPosition方法
WPF的TextBox控件本身没有提供RichTextBox那样的GetLineStartPosition API,但可以利用TextBox自带的GetLineIndexFromCharacterIndex和GetCharacterIndexFromLineIndex方法实现相同功能,具体方案如下:
实现扩展方法
通过扩展方法给TextBox添加该API,方便复用:
using System.Windows.Controls; public static class TextBoxExtensions { public static int? GetLineStartPosition(this TextBox textBox, int lineOffset) { if (textBox == null) return null; // 获取光标当前所在行的索引 int currentLine = textBox.GetLineIndexFromCharacterIndex(textBox.CaretIndex); int targetLine = currentLine + lineOffset; // 校验目标行是否在有效范围内 if (targetLine < 0 || targetLine >= textBox.LineCount) return null; // 返回目标行的起始字符位置 return textBox.GetCharacterIndexFromLineIndex(targetLine); } }
使用示例
和你给出的示例用法完全一致:
// 获取当前行起始字符位置 var charpos_x1 = textBox.GetLineStartPosition(0); // 获取下一行起始字符位置 var charpos_x2 = textBox.GetLineStartPosition(1); // 获取上一行起始字符位置 var charpos_x3 = textBox.GetLineStartPosition(-1);
注意事项
- 如果TextBox未获得焦点或
CaretIndex无效,方法会返回null,使用时需要做空值判断 - 该方法基于TextBox的实际显示行,包括自动换行和手动输入的换行符
内容的提问来源于stack exchange,提问作者Bill Moore
相关产品推荐
相关产品推荐

