删除WPF富文本框中的隐藏字符

时间:2012-06-10 19:32:07

标签: .net wpf vb.net twitter flowdocument

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

在我的应用程序中,我有一个包含Rich Text Box的对话框,该框中填充了从Twitter收集的Tweet。使用推文实体,我将推文格式化为包含推文,提及和主题标签中链接的内嵌超链接。但是,超链接永远不会正确定位;太快和太远总是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

这是我的Rich Text Box XAML:

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

这是输出:

The problem!

推文实体为每个实体都有适当的索引,但我认为富文本框中有隐藏的字符会导致这种偏移。

2 个答案:

答案 0 :(得分:1)

有趣的是没有人回答这个问题,但我有点理解,因为RichTextBoxes非常讨厌使用。我现在也遇到了麻烦。

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

我对VB不太满意,但只有当YourTextPointer.GetPointerContext(LogicalDirection.Forward)TextPointerContext.Text时,您才应该使用for循环并增加索引,否则,您只需跳过它。

这样你的索引就会与文本中的索引相匹配。

答案 1 :(得分: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;
}