我有一个WPF RichTextBox,我正在键入一些文本,然后解析整个文本进行处理。在这个解析过程中,我得到了每个单词的开头和结尾的绝对字符位置。
我想使用这些字符位置来对某些单词应用格式。但是,我发现FlowDocument使用TextPointer实例来标记文档中的位置。
我发现我可以通过使用开始指针和结束指针构造TextRange来创建它。一旦我有了TextRange,我就可以很容易地对其中的文本应用格式。我一直在使用GetPositionAtOffset为我的字符偏移量获取一个TextPointer,但我怀疑它的偏移量与我的不同,因为所选文本的位置与我预期的略有不同。
我的问题是,如何准确地将绝对字符位置转换为TextPointer?
发布于 2010-04-05 17:33:07
我没有找到一种将绝对字符位置转换为TextPosition实例的可靠方法。
我的替代解决方案是修改原始的解析,使其在单独的运行中工作,而不是捕获RichTextBox的整个文本。事实证明,使用与特定运行实例相关的字符位置对我来说是可靠的。我认为将我的心态更多地转向WPF的思维方式是有帮助的。
我采用了以下方法在FlowDocument中导航运行(灵感来自http://blogs.msdn.com/prajakta/archive/2006/10/12/customize-richtextbox-to-allow-only-plain-text-input.aspx):
// Get starting pointer
TextPointer navigator = flowDocument.ContentStart;
// While we are not at end of document
while (navigator.CompareTo(flowDocument.ContentEnd) < 0)
{
// Get text pointer context
TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward);
// Get parent as run
Run run = navigator.Parent as Run;
// If start of text element within run
if (context == TextPointerContext.ElementStart && run != null)
{
// Get text of run
string runText = run.Text;
// ToDo: Parse run text
}
// Get next text pointer
navigator = navigator.GetNextContextPosition(LogicalDirection.Forward);
}
发布于 2014-10-12 01:02:52
我也遇到过这个问题,并最终使用了以下RichTextBox扩展方法。在我的上下文中,它可以完美地工作!
/// <summary>
/// Gets the text pointer at the given character offset.
/// Each line break will count as 2 chars.
/// </summary>
/// <param name="richTextBox">The rich text box.</param>
/// <param name="offset">The offset.</param>
/// <returns>The TextPointer at the given character offset</returns>
public static TextPointer GetTextPointerAtOffset(this RichTextBox richTextBox, int offset)
{
var navigator = richTextBox.Document.ContentStart;
int cnt = 0;
while (navigator.CompareTo(richTextBox.Document.ContentEnd) < 0)
{
switch (navigator.GetPointerContext(LogicalDirection.Forward))
{
case TextPointerContext.ElementStart:
break;
case TextPointerContext.ElementEnd:
if (navigator.GetAdjacentElement(LogicalDirection.Forward) is Paragraph)
cnt += 2;
break;
case TextPointerContext.EmbeddedElement:
// TODO: Find out what to do here?
cnt++;
break;
case TextPointerContext.Text:
int runLength = navigator.GetTextRunLength(LogicalDirection.Forward);
if (runLength > 0 && runLength + cnt < offset)
{
cnt += runLength;
navigator = navigator.GetPositionAtOffset(runLength);
if (cnt > offset)
break;
continue;
}
cnt++;
break;
}
if (cnt > offset)
break;
navigator = navigator.GetPositionAtOffset(1, LogicalDirection.Forward);
} // End while.
return navigator;
}
发布于 2010-04-02 17:24:20
我有非常类似的问题,我发现RichTextBox中有一个错误,因为它不计算“新行字符- \r\n",所以当你的行号增加时,你会发现你的偏移量被行号计数错误地定位了,我已经通过从偏移量中偏移行号来解决我的问题。
https://stackoverflow.com/questions/2565783
复制相似问题