RichTextBox中的c#WPF行和列编号

RichTextBox中的c#WPF行和列编号,c#,.net,wpf,wpf-controls,richtextbox,C#,.net,Wpf,Wpf Controls,Richtextbox,我正在将一个应用程序从WinForms移植到WPF,在尝试获取文本框中所选内容的行号和列号时遇到了一个障碍。我可以在WinForms中非常简单地实现它,但是WPF有一种完全不同的实现RichTextBox的方式,所以我不知道如何实现它 这是我的WinForms解决方案 int line = richTextBox.GetLineFromCharIndex(TextBox.SelectionStart); int column = richTextBox.SelectionStart - Text

我正在将一个应用程序从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);
这不适用于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);

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

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();

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

要获得实际绝对行号(不计算换行行数):


您是否尝试过一些东西,来说明它是如何完全不同的?可能相关:您需要查找依赖项,但这不是一项容易的任务。我确实研究过这一点,看到了需要做多少工作(或者至少我需要学习多少),并更改了我的产品规格,这样我就可以避免它了!如果你的项目需要时间,你最好找一个第三方。使用我的WinForms解决方案@Will更新我可以从框中获取文本,但我无法获取选择器的位置,另外我还必须计算出它经过了多少行/列,Dave这真是太遗憾了:(谢谢!你的回答真的很有帮助。如果行号是1,我必须做一件小事情,那就是从列中减去1。我要发布我的工作解决方案
Paragraph currentParagraph = rtb.CaretPosition.Paragraph;

// the text becomes either currently selected and the selection reachted the end of the text or the text does not contain any data at all
if (currentParagraph == null)
{
    currentParagraph = rtb.Document.ContentEnd.Paragraph;
}

lineIndexAbsolute = Math.Max(rtb.Document.Blocks.IndexOf(currentParagraph), 0);