【发布时间】:2010-11-30 01:54:12
【问题描述】:
我有这个 WPF RichTextBox,我想以编程方式选择给定范围的字母/单词并突出显示它。我已经尝试过了,但它不起作用,可能是因为我没有考虑到一些隐藏的 FlowDocument 标签或类似标签。例如,我想选择字母 3-8,但选择了 2-6):
var start = MyRichTextBox.Document.ContentStart;
var startPos = start.GetPositionAtOffset(3);
var endPos = start.GetPositionAtOffset(8);
var textRange = new TextRange(startPos,endPos);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty,
new SolidColorBrush(Colors.Blue));
textRange.ApplyPropertyValue(TextElement.FontWeightProperty,
FontWeights.Bold);
我意识到 RichTextBox 的处理比我想象的要复杂一些 :)
更新:我在 MSDN 论坛上得到了一些答案:This thread where "dekurver" seid:
您指定的偏移量不是 字符偏移但符号偏移。 你需要做的是得到一个 你知道的TextPointer是相邻的 到文本,然后你可以添加字符 偏移量。
而“LesterLobo”说:
您将需要遍历 段落和内联来查找 接下来,然后它们在循环中的偏移量 申请所有的外观 具体文字。请注意,当您编辑 你的文字会移动,但你的 突出显示不会移动 与偏移量相关联而不是 文本。但是,您可以创建一个 自定义运行并为 它...
如果有人知道 FlowDocuments 的方式,我仍然希望看到一些示例代码...
编辑我得到了一个 Kratz VB 代码版本,它看起来像这样:
private static TextPointer GetPoint(TextPointer start, int x)
{
var ret = start;
var i = 0;
while (i < x && ret != null)
{
if (ret.GetPointerContext(LogicalDirection.Backward) ==
TextPointerContext.Text ||
ret.GetPointerContext(LogicalDirection.Backward) ==
TextPointerContext.None)
i++;
if (ret.GetPositionAtOffset(1,
LogicalDirection.Forward) == null)
return ret;
ret = ret.GetPositionAtOffset(1,
LogicalDirection.Forward);
}
return ret;
}
我是这样使用它的:
Colorize(item.Offset, item.Text.Length, Colors.Blue);
private void Colorize(int offset, int length, Color color)
{
var textRange = MyRichTextBox.Selection;
var start = MyRichTextBox.Document.ContentStart;
var startPos = GetPoint(start, offset);
var endPos = GetPoint(start, offset + length);
textRange.Select(startPos, endPos);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty,
new SolidColorBrush(color));
textRange.ApplyPropertyValue(TextElement.FontWeightProperty,
FontWeights.Bold);
}
【问题讨论】:
标签: c# wpf richtextbox