【问题标题】:How do I move the caret a certain number of positions in a WPF RichTextBox?如何在 WPF RichTextBox 中将插入符号移动一定数量的位置?
【发布时间】:2010-08-17 23:30:05
【问题描述】:

我想将插入符号移动到当前插入符号右侧的 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 属性。我选择忽略 is 并滚动我自己的选项卡功能,因为使用 AcceptsTab 进行选项卡具有令人讨厌的副作用,即在后续行中缩进文本,这不是我想要的。

【问题讨论】:

    标签: wpf richtextbox


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 哇,我一定错过了!我会尽快试一试,谢谢! :)
      • 对不起,没有骰子。插入符号没有移动到插入文本的末尾。
      • 对我也不起作用,唯一有效的解决方案是公认的解决方案。
      【解决方案3】:

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

      rtb.CaretPosition = rtb.Document.ContentEnd;
      

      如果可行,您可能必须针对选项卡不在内容末尾的情况实施额外的逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多