Wpf Richtextbox选择的起始列和行号返回不同的值

本文关键字:返回 选择 Richtextbox Wpf | 更新日期: 2023-09-27 18:30:05

我正在初始化我的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)));
    }

上面的代码中有荣的内容吗。请帮帮我提前感谢!

Wpf Richtextbox选择的起始列和行号返回不同的值

这是因为RTB中的内容不仅包含文本,还包含这些称为TextPointerContext的内容。TextPointer考虑到了这一点。您可以使用来检查TextPointer与什么相邻

TextPointer.GetPointerContext(LogicalDirection);

获取下一个文本指针:

TextPointer.GetNextContextPosition(LogicalDirection);

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

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

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

狩猎得好!