如何在给定索引和长度的情况下选择RichTextBox文本

时间:2012-08-22 02:29:27

标签: c# .net wpf richtextbox

如果只给你选择某个文本的索引和长度(或EndIndex),你如何在WPF版本的RichTextBox中执行此操作?

这在Textbox中是非常可行的,因为你可以调用Textbox.Select(startIndex,Length)但我在RTB中看不到任何等效的内容。

编辑:我找到了做出选择的答案

internal string Select(RichTextBox rtb, int index, int length)
        {
            TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);

            if (textRange.Text.Length >= (index + length))
            {
                TextPointer start = textRange.Start.GetPositionAtOffset(index, LogicalDirection.Forward);
                TextPointer end = textRange.Start.GetPositionAtOffset(index + length, LogicalDirection.Backward);
                rtb.Selection.Select(start, end);
            }
            return rtb.Selection.Text;
        } 

但是,当我尝试在选择之后突出显示该行时:

rtb.Selection.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.LightBlue));

突出显示功能仅在第一次尝试时起作用,在第二次尝试后中断。有人知道这个的原因吗?

3 个答案:

答案 0 :(得分:5)

好的,这个问题已经过时但我终于找到了答案,所以我把它放在这里。

当我尝试使用RichTextBox创建一些Syntaxhighlighter时,我遇到了类似的问题。 我发现,当你用 ApplyPropertyValue 玩arround时,你不能再使用 GetPositionAtOffset 了。我认为,应用财产价值似乎会改变内部职位"文件中的TextTokens,因此制动'这个功能。

解决方法:

每当您需要使用 GetPositionAtOffset 时,首先在文档的完整TextRange上调用 ClearAllProperties ,然后使用 ApplyPropertyValue 重新应用所有属性,但此时从右到左。 (右边意味着最高的偏移量)

我不知道你是否已经应用任何PropertyValues期望选择突出显示,所以你可能需要更多的思考。

这是我的代码在导致问题时的外观:

    private void _highlightTokens(FlowDocument document)
    {
        TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd);
        foreach (Token token in _tokenizer.GetTokens(fullRange.Text))
        {
            TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position);
            TextPointer end = start.GetPositionAtOffset(token.Length);

            TextRange range = new TextRange(start, end);
            range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token));
        }
    }

我修好了这个:

    private void _highlightTokens(FlowDocument document)
    {
        TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd);
        fullRange.ClearAllProperties(); // NOTICE: first remove allProperties.
        foreach (Token token in _tokenizer.GetTokens(fullRange.Text).Reverse()) // NOTICE: Reverse() to make the "right to left" work
        {
            TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position);
            TextPointer end = start.GetPositionAtOffset(token.Length);

            TextRange range = new TextRange(start, end);
            range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token));
        }
    }

答案 1 :(得分:-1)

使用Select()属性上的RichTextBox.Selection方法。

答案 2 :(得分:-1)

  

Blockquote你可以在空格之间得到文字......

私有字符串RichWordOver(RichTextBox rch,int x,int y)         {

        int pos = rch.GetCharIndexFromPosition(new Point(x, y));
        if (pos <= 0) return "";


        string txt = rch.Text;

        int start_pos;
        for (start_pos = pos; start_pos >= 0; start_pos--)
        {

            char ch = txt[start_pos];
            if (!char.IsLetterOrDigit(ch) && !(ch=='_')) break;
        }
        start_pos++;
        int end_pos;
        for (end_pos = pos; end_pos < txt.Length; end_pos++)
        {
            char ch = txt[end_pos];
            if (!char.IsLetterOrDigit(ch) && !(ch == '_')) break;
        }
        end_pos--;


        if (start_pos > end_pos) return "";
        return txt.Substring(start_pos, end_pos - start_pos + 1);
    }

private void rchText_MouseClick(对象发送者,MouseEventArgs e)         {             MessageBox.Show(RichWordOver(rchText,e.X,e.Y));         }