如何将插入符号移动到WPF RichTextBox中的一定数量的位置?

时间:2010-03-23 02:53:17

标签: wpf richtextbox

我想将插入符号4个位置移动到我的插入符号所在的位置。我已注册PreviewKeyDown,并在捕获标签键时调用InsertTextInRun(),如下所示:

private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        rtb.CaretPosition.InsertTextInRun("    ");
        e.Handled = true;
    }
}

问题是,在致电InsertTextInRun()后,插入符号保持不变。它移动到新文本的末尾,这是我想要的行为。我该怎么做?


暂且不说 - 是的,我知道AcceptsTab上的RichTextBox属性。我选择忽略is并滚动我自己的标签功能,因为使用AcceptsTab标签会对后续行缩进文字产生令人讨厌的副作用,这是我想要的。

3 个答案:

答案 0 :(得分:8)

我刚刚碰到同样的问题。似乎最终的插入位置取决于它在插入之前的移动方式。

以下代码确保(3.5sp1)插入后,光标将位于插入文本的右侧:

 rtb.CaretPosition = rtb.CaretPosition.GetPositionAtOffset(0, LogicalDirection.Forward);
rtb.CaretPosition.InsertTextInRun(text);

请注意,插入符号的LogicalDirection属性可能(并且必须)由此更改;仅仅创建正确的TextPointer是不够的。

答案 1 :(得分:1)

在CaretPosition TextPointer上使用GetInsertionPosition()方法。这将允许您在插入符号之前插入文本。

private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        rtb.CaretPosition.GetInsertionPosition(LogicalDirection.Backward).InsertTextInRun("    ");
        e.Handled = true;
    }
}

答案 2 :(得分:1)

要进行测试,您可以尝试自己强制移动:

rtb.CaretPosition = rtb.Document.ContentEnd;

如果可行,您可能必须在标签不在内容末尾的情况下实施其他逻辑。