c#WPF来自RichTextBox的行号和列号

Jos*_*tle 5 .net c# wpf richtextbox wpf-controls

我正在将一个应用程序从WinForms移植到WPF,我试图获取选择在文本框中的位置的行号和列号时遇到了麻烦.我能够在WinForms中完成它,但WPF有一种完全不同的方式来实现RichTextBox,所以我不知道如何去做.

这是我的WinForms解决方案

int line = richTextBox.GetLineFromCharIndex(TextBox.SelectionStart);
int column = richTextBox.SelectionStart - TextBox.GetFirstCharIndexFromLine(line);

LineColumnLabel.Text = "Line " + (line + 1) + ", Column " + (column + 1);
Run Code Online (Sandbox Code Playgroud)

这不适用于WPF,因为您无法获取当前选择的索引.

这是工作解决方案:

int lineNumber;
textBox.CaretPosition.GetLineStartPosition(-int.MaxValue, out lineNumber);
int columnNumber = richTextBox.CaretPosition.GetLineStartposition(0).GetOffsetToPosition(richTextBox.CaretPosition);
if (lineNumber == 0)
    columnNumber--;

statusBarLineColumn.Content = string.Format("Line {0}, Column {1}", -lineNumber + 1, columnNumber + 1);
Run Code Online (Sandbox Code Playgroud)

Sis*_*sco 8

这样的事情可能会给你一个起点.

TextPointer tp1 = rtb.Selection.Start.GetLineStartPosition(0);
TextPointer tp2 = rtb.Selection.Start;

int column = tp1.GetOffsetToPosition(tp2);

int someBigNumber = int.MaxValue;
int lineMoved, currentLineNumber;
rtb.Selection.Start.GetLineStartPosition(-someBigNumber, out lineMoved);
currentLineNumber = -lineMoved;

LineColumnLabel.Content = "Line: " + currentLineNumber.ToString() + " Column: " + column.ToString();
Run Code Online (Sandbox Code Playgroud)

有几点需要注意.第一行将是第0行,因此您可能需要在行号中添加+ 1.此外,如果换行的初始列将为0,但第一行和CR后面的任何行将列出初始位置为列1.