0

(由于这个问题没有得到任何答案,我已经重新措辞了)

在我的应用程序中,我有一个包含富文本框的对话框,该框充满了从 Twitter 收集的推文。使用推文实体,我将推文格式化为具有指向推文、提及和主题标签中链接的内联超链接。但是,超链接永远不会正确定位;总是太快太远了 2 或 3 个字符。

这是我用来在富文本框中设置文本的代码:

TweetText.Document.ContentEnd.InsertTextInRun(Status.Text)
Dim FlowDocument As FlowDocument = TweetText.Document
If LinkEntity.Count > 0 Then
            For Each Entity As Entities.TwitterUrlEntity In LinkEntity
                Dim Start As TextPointer = FlowDocument.ContentStart
                Dim StartPosition As TextPointer
                Dim EndPosition As TextPointer
                If Entity.StartIndex = 0 Then
                    StartPosition = Start.GetPositionAtOffset(Entity.StartIndex)
                Else
                    StartPosition = Start.GetPositionAtOffset(Entity.StartIndex)
                End If
                EndPosition = Start.GetPositionAtOffset(Entity.StartIndex + Entity.DisplayUrl.Length, LogicalDirection.Backward)
                Dim h As New Hyperlink(StartPosition, EndPosition)
                AddHandler h.MouseLeftButtonDown, AddressOf Hyperclick_Link
                h.NavigateUri = New Uri(Entity.Url)
                h.Cursor = Cursors.Hand
            Next
        End If
'I have the other entities here, they have very similar code'
TweetText.Document = FlowDocument

这是我的富文本框 XAML:

<RichTextBox Name="TweetText" Margin="5" FontSize="14" BorderThickness="0" IsReadOnly="True" />

这是输出:

问题!

推文实体对每个实体都有适当的索引,但我确实认为富文本框具有导致此偏移的隐藏字符。

4

2 回答 2

1

有趣的是没有人回答这个问题,但我有点明白,因为RichTextBoxes使用起来非常讨厌。我目前也有一个问题。

所以,你是对的,RichTextBox确实使用了隐藏字符,但你不应该尝试删除它们,因为它们有助于它以它的方式工作。索引时只需要计算字符符号,而不需要计算其他不可见的标签和符号。

我对 VB 不太擅长,但你应该能够使用 for 循环并仅在YourTextPointer.GetPointerContext(LogicalDirection.Forward)is时增加索引TextPointerContext.Text,否则,你只需跳过它。

这样,您的索引将与文本中的索引匹配。

于 2012-07-30T09:19:42.253 回答
1

近10年后..

好的,我会做的:D

出于我的目的,我所有的文本总是在一个段落中,所以使用这段代码我只检查它的内容(当然可以修改它以检查所有段落):

public static string GetText(this RichTextBox richTextBox)
{
    string textWithoutHiddenSymbols = "";

    Paragraph p = (Paragraph)richTextBox.Document.Blocks.FirstBlock;

    if (p != null)
    {
        InlineCollection inlines = p.Inlines;

        foreach (var inline in inlines)
        {
            textWithoutHiddenSymbols += (inline as Run)?.Text;
        }
    }

    return textWithoutHiddenSymbols;
}
于 2021-06-01T21:03:58.687 回答