【问题标题】:How To Set Caret Position At The End Of Current Line In A RichTextBox如何在 RichTextBox 中的当前行末尾设置插入符号位置
【发布时间】:2019-09-04 21:16:58
【问题描述】:

我正在尝试将 RichTextBox 的插入符号放在它所在的当前行的末尾。.CaretPosition 属性与仅使用常规 TextBox 的简单 .CaretIndex 属性相比是一个很大的变化.

为了解决这个问题,我制作了自己的用户控件,它只是一个RichTextBox,它具有TextBox 的大部分属性/方法,例如.LineCount.Text、@987654330 @ 等。我在我的用户控件中创建了一个 CaretIndex { get; set; } 属性,如下所示:

public int CaretIndex
        {
            get
            {
                TextPointer start = display.Document.ContentStart;
                TextPointer curPosition = display.CaretPosition;
                TextRange range = new TextRange(start, curPosition);
                return range.Text.Length;
            }
            set
            {
                display.CaretPosition = display.Document.ContentStart;
                for (int i = 0; i < value; i++)
                {
                    TextPointer move = display.CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);
                    if (move != null)
                        display.CaretPosition = move;
                }
            }
        }    

get 方法似乎工作正常,但 set 并没有达到我的预期。我的目标是让插入符号在逻辑上向前移动一个“价值”的次数——价值是我想过去多少个字符——但结果只是抽象的插入符号放置行为。插入符号可以向下放置几行,就在原始行的正下方,或者一直放置到RichTextBox 的底部。

我想要的只是一种简单的方法来向左或向右移动插入符号,而不会出现未定义的行为。我是否以错误的方式接近我的CaretIndex 财产?我对RichTextBoxCaretPosition 属性有错误的认识吗?有什么建议吗?

【问题讨论】:

  • 你可能想试试display.CaretPosition.GetPositionAtOffset(CaretIndex, LogicalDirection.Forward);stackoverflow.com/a/18653876/5308388
  • @Riddell 它需要在一个循环中还是只需要一个班轮?
  • @Riddell 这也不起作用,它只是返回 null

标签: c# wpf richtextbox


【解决方案1】:

我制作了一个小型 wpf 应用程序来测试您的代码 -

xaml -

<Grid.RowDefinitions>
    <RowDefinition Height="300"/>
    <RowDefinition Height="100"/>
    <RowDefinition Height="100"/>
</Grid.RowDefinitions>

<RichTextBox Grid.Row="0" Name="Rtb" />
<Button Grid.Row="1" Content="Get" Click="Button_Get" />

<Grid Grid.Row="2">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0" Content="Set" Click="Button_Set" />
    <TextBox Grid.Column="1" Name="DesiredPositionBox" />
</Grid>

c# -

    public MainWindow()
    {
        InitializeComponent();

        Rtb.AppendText("lineoftextlineoftextlineoftextlineoftext");
        Rtb.AppendText(Environment.NewLine);
        Rtb.AppendText("lineoftextlineoftextlineoftextlineoftext");
    }

    private void Button_Get(object sender, RoutedEventArgs e)
    {
        TextPointer start = Rtb.Document.ContentStart;
        TextPointer curPosition = Rtb.CaretPosition;
        TextRange range = new TextRange(start, curPosition);
        Debug.WriteLine("Caret position : " + range.Text.Length);

        Rtb.Focus();
    }

    private void Button_Set(object sender, RoutedEventArgs e)
    {
        int value = int.Parse(DesiredPositionBox.Text);

        Rtb.CaretPosition = Rtb.Document.ContentStart;
        for (int i = 0; i < value; i++)
        {
            TextPointer move = Rtb.CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);
            if (move != null)
                Rtb.CaretPosition = move;
        }

        Rtb.Focus();
    }

Rtb.CaretPosition = Rtb.Document.ContentStart; 行每次都会将插入符号移到开头,因此如果传入“5”,插入符号将被移到 RichTextBox 开头的第 5 个字符。

删除Rtb.CaretPosition = Rtb.Document.ContentStart;,插入符号将从原来的位置移动x

编辑: 还要回答如何将插入符号放在行尾, 您可以使用Rtb.CaretPosition.GetTextRunLength(LogicalDirection.Forward) 获取 第一个非文本符号(恰好是换行符)之前的字符数,从插入符号开始计数。

所以——

        int value = Rtb.CaretPosition.GetTextRunLength(LogicalDirection.Forward);
        TextPointer move = Rtb.CaretPosition.GetPositionAtOffset(value);
        Rtb.CaretPosition = move;

【讨论】:

  • 假设您想要的所有文本都已添加到富文本框中,这将起作用。如果您正在添加文本并同时尝试移动插入符号,则富文本框将表现得好像其内容来自文本输入之前一样。此外,富文本框自动输入的整个“\r\n”内容非常烦人,我认为这就是将插入符号放在富文本框底部的原因
  • 您提出的问题是“如何在 RichTextBox 中的当前行末尾设置插入符号位置”,并指出“我的目标是让插入符号在逻辑上向前移动一个“值”问题中的次数”。可以编辑您的问题以进一步澄清您正在寻找的确切内容,因为我发布的代码回答了这两个问题。此外,您可能需要在插入文本 (stackoverflow.com/a/39990299/10835140) 后更新插入符号的位置。
猜你喜欢
  • 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
相关资源
最近更新 更多