尝试重置 WPF 富文本框控件中的光标位置
Trying to reset the cursor position in a WPF Rich Text Box control
我有一个 WPF 富文本框控件,我在其中用相同长度的新文本替换文本,我只是想在替换文本之前获取原始插入符号位置,替换文本然后重置插入符号位置。
我认为问题在于它使用了绑定到 RichTextBox 的 TextPointer,并且在我清除原始文本时被重置,以便在重新应用它时位置发生变化。我实际上想做的是将其重置为原始文本中的字符位置索引,或者我很乐意处理 Lined 和 Columns。
我在互联网上搜索了应该是一个非常简单的问题的答案,但似乎没有任何答案。我真正想要的是 X/Y 坐标或任何有帮助的东西。
您可以使用 GetOffsetToPosition()
和 GetPositionAtOffset()
来保存和恢复插入符号的相对位置。
换句话说,假设 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;
}
注意 class 中的三个私有字段。
在替换文本之前,您应该保存插入符号的段落索引和段落中的插入符号索引:
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);
}
请注意,这是一个简单的示例,RichTextBox.Document
中可能还有其他 Block
。但是,想法和实现并没有太大的不同。
我有一个 WPF 富文本框控件,我在其中用相同长度的新文本替换文本,我只是想在替换文本之前获取原始插入符号位置,替换文本然后重置插入符号位置。
我认为问题在于它使用了绑定到 RichTextBox 的 TextPointer,并且在我清除原始文本时被重置,以便在重新应用它时位置发生变化。我实际上想做的是将其重置为原始文本中的字符位置索引,或者我很乐意处理 Lined 和 Columns。
我在互联网上搜索了应该是一个非常简单的问题的答案,但似乎没有任何答案。我真正想要的是 X/Y 坐标或任何有帮助的东西。
您可以使用 GetOffsetToPosition()
和 GetPositionAtOffset()
来保存和恢复插入符号的相对位置。
换句话说,假设 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;
}
注意 class 中的三个私有字段。
在替换文本之前,您应该保存插入符号的段落索引和段落中的插入符号索引:
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);
}
请注意,这是一个简单的示例,RichTextBox.Document
中可能还有其他 Block
。但是,想法和实现并没有太大的不同。