在Winforms RichTextBox控件中,我之前使用 GetLineFromCharIndex 方法和 GetFirstCharIndexOfCurrentLine 来计算当前行上键入文本的起点和终点。< / p>
我正在努力使用Silverlight 4中的新RichTextBox控件,因为似乎没有等效的方法。 GetPositionFromPoint 可用,但看起来很笨重。
干杯。
更新了...我已经做了一些工作,但这需要我使用控件的Select方法,这感觉非常错误......
private string GetCurrentLine()
{
TextPointer prevSelStart = richTextBox1.Selection.Start;
Point lineStart = new Point(0, prevSelStart.GetCharacterRect(LogicalDirection.Forward).Y);
TextPointer prevSelEnd = richTextBox1.Selection.End;
TextPointer currentLineStart = richTextBox1.GetPositionFromPoint(lineStart);
//need to find a way to get the text between two textpointers
//other than performing a temporary selection in the rtb
richTextBox1.Selection.Select(currentLineStart, prevSelStart);
string text = richTextBox1.Selection.Text;
//revert back to previous selection
richTextBox1.Selection.Select(prevSelStart, prevSelEnd);
return text;
}
答案 0 :(得分:1)
我认为你无法避免选择,这是一种正确的选择(“选择”只是一个逻辑选择),但你可以避免使用GetPositionFromPoint
TextPointer.GetNextInsertionPosition(LogicalDirection )
:从richTextBox1.Selection.Start
开始,然后移向行的开头(char!='\ n')
答案 1 :(得分:1)
我需要弄清楚当我在RTB的顶线或底线时。为此,我使用GetCharacterRect方法然后比较顶部以查看它是在最后一行还是第一行。
您也可以这样做并使用文本指针来移动文本以及顶部不匹配的次数。
这是用于查看光标是在第一行还是最后一行的代码:
private bool IsCursorOnFirstLine()
{
TextPointer contentStart = this.ContentStart;
TextPointer selection = this.Selection.End;
Rect startRect = contentStart.GetCharacterRect(LogicalDirection.Forward);
Rect endRect = selection.GetCharacterRect(LogicalDirection.Forward);
return startRect.Top == endRect.Top;
}
private bool IsCursorOnLastLine()
{
TextPointer start = this.Selection.Start;
TextPointer end = this.ContentEnd;
Rect startRect = start.GetCharacterRect(LogicalDirection.Forward);
Rect endRect = end.GetCharacterRect(LogicalDirection.Backward);
return startRect.Top == endRect.Top;
}