1

我正在初始化我的 Richtextbox,

void InitRTBFlowDocument()
    {
        Style noSpaceStyle = new Style(typeof(Paragraph));
        noSpaceStyle.Setters.Add(new Setter(Paragraph.MarginProperty, new Thickness(0)));
        rtbTextEditor.Resources.Add(typeof(Paragraph), noSpaceStyle);
    }

我想获取 Richtext 框选择字的行号和列号。我编写的代码如下,第一次正确返回。

void rtbTextEditor_SelectionChanged(object sender, RoutedEventArgs e)
    {
        //Get the richtext box selected text
        Init.RTBSelectionText = rtbTextEditor.Selection.Text.Trim();
        Init.SelectionText = rtbTextEditor.Selection.Text.Trim();
        Init.isSelect = true;
        if (Init.RTBSelectionText != string.Empty)
        {
            TextPointer tp = rtbTextEditor.Selection.Start.GetPositionAtOffset(-2, LogicalDirection.Forward);
            if (tp != null)
                GetStartingIndex();
        } 
        Init.RTBContent = new TextRange(rtbTextEditor.Document.ContentStart, rtbTextEditor.Document.ContentEnd).Text;
    }

void GetStartingIndex()
    {
        TextPointer tp1 = rtbTextEditor.Selection.Start.GetLineStartPosition(0);
        TextPointer tp2 = rtbTextEditor.Selection.Start;

        int SelectionColumnIndex = tp1.GetOffsetToPosition(tp2)-1;//column number

        int someBigNumber = int.MaxValue;
        int lineMoved;
        rtbTextEditor.Selection.Start.GetLineStartPosition(-someBigNumber, out lineMoved); //Line number
        int SelectionRowIndex = -lineMoved;

        Init.RTBTextPoint = new RTBTextPointer();
        Init.RTBTextPoint.Row = SelectionRowIndex;
        Init.RTBTextPoint.Column = SelectionColumnIndex;
     }

清除并添加新内容后,位置返回错误数字,

 public void DisplayContent(string content)
    {
        //Clear the rich text box
        rtbTextEditor.Document.Blocks.Clear();

        rtbTextEditor.Document.Blocks.Add(new Paragraph(new Run(content)));
    }

上面的代码有什么问题吗?请帮助我提前谢谢!

4

1 回答 1

0

这是因为 RTB 中的内容不仅包含文本,它还包含这些称为 TextPointerContext 的东西。TextPointer 考虑到了这一点。您可以使用以下方法检查 TextPointer 相邻的内容:

TextPointer.GetPointerContext(LogicalDirection);

要获取下一个 TextPointer:

TextPointer.GetNextContextPosition(LogicalDirection);

我在最近的一个项目中使用了一些示例代码,这可以确保指针上下文是 Text 类型:

while (start.GetPointerContext(LogicalDirection.Forward) 
                             != TextPointerContext.Text)
{
    start = start.GetNextContextPosition(LogicalDirection.Forward);
    if (start == null) return;
}

当您清除 RTB 时,您可能正在删除其中一些指针上下文。所以在使用 GetPositionAtOffset() 时要小心。这应该给你一个正确方向的“指针”。如果您需要更多帮助我知道。

好狩猎!

于 2013-09-04T12:17:10.517 回答