我有一个富文本框,我允许用户突出显示文本。正在加载的文本来自简单的纯文本文件。但是我需要存储突出显示文本的绝对开始和结束字符位置(相对于文档的开头),这样当它们保存时,它可以重新加载高亮显示。
到目前为止,我可以执行此操作以应用突出显示
private void textBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
HighlightWordInTextBox(this.textBox, this.textBox.Selection.ToString(), new SolidColorBrush(Colors.Yellow));
}
public void HighlightWordInTextBox(RichTextBox textbox, string word, SolidColorBrush color)
{
TextRange tr = new TextRange(this.textBox.Selection.Start, this.textBox.Selection.End);
tr.ApplyPropertyValue(TextElement.BackgroundProperty, color);
}
但是我没有在选择的Start或End对象中看到任何提供角色位置的东西?几乎所有方法都返回另一个TextPointer - 但是如何从TextPointer中获取字符位置?
假设所有文本都加载到单个
中 this.textBox.Document.Blocks.Add(new Paragraph(new Run(fullText)));
修改
在调试的即时窗口中,我可以访问名为CharOffset和Offset的东西,但在源代码中不能这样做,它会产生编译错误。此外,这些属性虽然在运行时检查对象时存在,但它们不在文档中。
然而......
答案 0 :(得分:2)
你可以找到选择的开始和结束的索引......
var docStart = textBox.Document.ContentStart;
var selectionStart = textBox.Selection.Start;
var selectionEnd = textBox.Selection.End;
//these will give you the positions needed to apply highlighting
var indexStart = docStart.GetOffsetToPosition(selectionStart);
var indexEnd = docStart.GetOffsetToPosition(selectionEnd);
//these values will give you the absolute character positions relative to the very beginning of the text.
TextRange start = new TextRange(docStart, selectionStart);
TextRange end = new TextRange(docStart, selectionEnd);
int indexStart_abs = start.Text.Length;
int indexEnd_abs = end.Text.Length;