代码之家  ›  专栏  ›  技术社区  ›  Rob

如何在wpf richtextbox中将插入符号移动一定数量的位置?

  •  8
  • Rob  · 技术社区  · 16 年前

    我想移动插入符号4个位置到当前插入符号的右侧。我注册了 PreviewKeyDown ,并呼叫 InsertTextInRun() 当Tab键被捕获时,如下所示:

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

    问题是插入符号在调用 inserttextinrun() . 它确实 移到新文本的末尾,这是我想要的行为。我该怎么做?


    作为旁白-是的,我知道 AcceptsTab 属性对 RichTextBox . 我选择忽略IS并滚动我自己的选项卡功能,因为 小精灵 在后面的行上缩进文本有一个讨厌的副作用,就是 我想要什么。

    3 回复  |  直到 15 年前
        1
  •  8
  •   DK.    16 年前

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

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

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

    注意,插入符号的logicaldirection属性可能(而且必须)由此更改;仅仅创建正确的文本指针是不够的。

        2
  •  1
  •   Tarsier    16 年前

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

    private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Tab)
        {
            rtb.CaretPosition.GetInsertionPosition(LogicalDirection.Backward).InsertTextInRun("    ");
            e.Handled = true;
        }
    }
    
        3
  •  1
  •   Pakman    15 年前

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

    rtb.CaretPosition = rtb.Document.ContentEnd;
    

    如果这样做有效,您可能需要为选项卡不在内容末尾的情况实现额外的逻辑。

    推荐文章