如果只给你一个要选择的特定文本的索引和长度(或 EndIndex),你如何在 RichTextBox 的 WPF 版本中执行此操作?
这在 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));
突出显示功能仅在第一次尝试时有效,并在第二次尝试后中断。有人知道这是什么原因吗?
好吧,这个问题很旧,但我终于找到了答案,所以我把它放在这里。
当我尝试使用 RichTextBox 制作一些 Syntaxhighlighter 时,我遇到了类似的问题。
我发现,当你玩弄应用属性值你不能简单地使用获取偏移位置不再了。我相信应用 propertyvalues 似乎会改变文档中 TextTokens 的“内部位置”,从而“阻止”此功能。
解决方法:
每当您需要与您合作时获取偏移位置第一次通话清除所有属性在文档的完整 TextRange 上,然后使用重新应用所有属性应用属性值但这一次从右到左。 (右侧表示最高偏移)
我不知道您是否应用了任何 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));
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)