簡體   English   中英

如何在RichTextBox中的當前行末尾設置插入符位置

[英]How To Set Caret Position At The End Of Current Line In A RichTextBox

我正在嘗試將RichTextBox的插入符號放置在當前行的.CaretPosition屬性與僅使用常規TextBox的簡單.CaretIndex屬性相比有很大的變化。

為了解決此問題,我制作了自己的用戶控件,它只是一個RichTextBox ,它具有TextBox大多數屬性/方法,例如.LineCount.Text.CaretIndex等。我制作了CaretIndex { get; set; } CaretIndex { get; set; } 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以錯誤的方式訪問我的CaretIndex屬性? 我對RichTextBoxCaretPosition屬性有CaretPosition嗎? 有什么建議嗎?

我制作了一個小型的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM