我有一个WPF富文本框控件,我用相同长度的新文本替换文本,我只想在替换文本之前获取原始插入位置,替换文本然后重置插入位置。
我认为问题在于它使用了与RichTextBox绑定的TextPointer,并在清除原始文本时重置,以便在重新应用它时,位置已更改。我真正想要做的是将其重置为原始文本中的字符位置索引,或者我很乐意处理Lined和Columns。
我已经在互联网上搜索了一个应该是一个非常简单的问题的答案,似乎没有什么可以回答它。我真正想要的是X / Y坐标或任何有用的东西。
答案 0 :(得分:0)
您可以使用GetOffsetToPosition()
和GetPositionAtOffset()
来保存Caret的相对位置并将其恢复。
换句话说,假设RichTextBox初始化如下:
RichTextBox rtb;
int paragraphIndex = -1;
int indexInParagraph;
public MainWindow()
{
InitializeComponent();
rtb = new RichTextBox();
rtb.Document = new FlowDocument();
Paragraph para = new Paragraph(new Run("some text some text some text."));
rtb.Document.Blocks.Add(para);
// sets the caret at a specific (random) position in the paragraph:
rtb.CaretPosition = para.ContentStart.GetPositionAtOffset(5);
this.Content = rtb;
}
请注意班级中的三个私有字段。
在替换文本之前,您应该在段落中保存插入符号的段落索引和插入符索引:
public void SaveCaretState()
{
//enumerate and get the paragraph index
paragraphIndex = -1;
foreach (var p in rtb.Document.Blocks)
{
paragraphIndex++;
if (p == rtb.CaretPosition.Paragraph)
break;
}
//get index relative to the start of the paragraph:
indexInParagraph = rtb.CaretPosition.Paragraph.ElementStart.GetOffsetToPosition(rtb.CaretPosition);
}
并随时恢复:
public void RestoreCaretState(MouseEventArgs e)
{
// you might need to insure some conditions here (paragraph should exist and ...)
Paragraph para = rtb.Document.Blocks.ElementAt(paragraphIndex) as Paragraph;
rtb.CaretPosition = para.ElementStart.GetPositionAtOffset(indexInParagraph);
}
请注意,这是一个简单示例,Block
中可能还有其他RichTextBox.Document
个。但是,这个想法和实现并没有太大的不同。