如何在WPF RichTextBox中将插入符号移动到特定位置?

9

我希望将插入符号向右移动4个位置。我已经注册了PreviewKeyDown事件,并在捕获Tab键时调用InsertTextInRun()方法,如下所示:

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

问题在于,在调用InsertTextInRun()后,插入符号停留在原地。它没有移动到新文本的末尾,而这正是我想要的行为。我该怎么做?
另外 - 是的,我知道RichTextBox上的AcceptsTab属性。我选择忽略它并自己编写制表符功能,因为使用AcceptsTab进行制表会在后续行上缩进文本,这不是我想要的行为。
3个回答

11

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

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

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

请注意,插入符的LogicalDirection属性可能会(并且必须)通过此操作进行更改;仅仅创建正确的TextPointer是不够的。

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;
    }
}

哇,我一定错过了那个!我马上试试,谢谢! :) - Rob
1
抱歉,不行。插入的文本未使插入符号移到末尾。 - Rob
我也尝试过,但没有成功,唯一有效的解决方案是被采纳的那个。 - ToastyMallows

1

为了测试,你可以尝试强制自己移动:

rtb.CaretPosition = rtb.Document.ContentEnd;

如果那个可以运行,你可能需要实现额外的逻辑来应对标签不在内容末尾的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接