Удалить скрытые символы в расширенном текстовом поле WPF

(Поскольку на этот вопрос не было ответов, я переформулировал его)

В моем приложении у меня есть диалоговое окно, содержащее форматированное текстовое поле, поле заполнено твитом, собранным из Твиттера. Используя объекты твитов, я форматирую твит, чтобы он содержал встроенные гиперссылки на ссылки в твите, упоминания и хэштеги. Однако гиперссылки никогда не располагаются правильно; всегда быть на 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" />

Это результат:

Проблема!

Сущность твита имеет правильные индексы для каждой сущности, но я думаю, что в расширенном текстовом поле есть скрытые символы, которые вызывают это смещение.


person ecnepsnai    schedule 10.06.2012    source источник


Ответы (2)


Интересно, что никто не ответил на этот вопрос, но я вроде как понимаю, потому что RichTextBoxes очень неприятны в использовании. У меня сейчас тоже проблемы с одним.

Итак, вы правы, RichTextBox действительно использует скрытые символы, но вам не следует пытаться их удалить, так как они помогают ему работать так, как он работает. При индексировании необходимо учитывать только символьные символы, а не другие невидимые теги и символы.

Я не очень хорошо разбираюсь в VB, но вы должны иметь возможность использовать цикл for и увеличивать свой индекс, только если YourTextPointer.GetPointerContext(LogicalDirection.Forward) равно TextPointerContext.Text, иначе вы просто пропустите его.

Таким образом, ваши индексы будут соответствовать индексам в тексте.

person Dejan Maksimovic    schedule 30.07.2012
comment
Хорошо, я попробую это. В настоящее время я далеко от компьютера с Windows, но когда я вернусь к нему, я проверю вашу теорию. Спасибо! - person ecnepsnai; 31.07.2012

После почти 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;
}
person Starwave    schedule 01.06.2021