(由于这个问题没有得到任何答案,我已经重新措辞了)
在我的应用程序中,我有一个包含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" />
这是输出:
推文实体为每个实体都有适当的索引,但我认为富文本框中有隐藏的字符会导致这种偏移。
答案 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;
}