簡體   English   中英

在 RichTextBox 中的索引處設置插入符號 WPF

[英]Set caret at an index in RichTextBox WPF

我正在嘗試根據單詞的索引 position 在richtextbox中設置插入符號 position。 即使我能夠更改插入符號 position,插入符號也不會移動到正確的位置。

這是我的示例代碼:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        RTB_Main.Document.Blocks.Clear();
        for (int i = 0; i < 10; i++)
        {
            Paragraph para = new Paragraph(new Run(i + ""));
            RTB_Main.Document.Blocks.Add(para);
        }
        TextRange richText = new TextRange(RTB_Main.Document.ContentStart, RTB_Main.Document.ContentEnd);
        string searchText = tb_Search.Text; // 1 to 9

        int position = Regex.Match(richText.Text, searchText).Index;

        RTB_Main.CaretPosition = RTB_Main.Document.ContentStart;
        RTB_Main.CaretPosition = RTB_Main.CaretPosition.GetPositionAtOffset(position);
        RTB_Main.Focus();
    }

這種方法有什么問題? 另外,請讓我知道是否有更好的方法將插入符號 position 設置為索引?

我的問題是由換行符\\r\\n 我只是用其他字符替換了這些,它對我有用。 請注意,我不是用 2 個字符而是用 4 個字符替換它們。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        RTB_Main.Document.Blocks.Clear();
        for (int i = 0; i < 10; i++)
        {
            Paragraph para = new Paragraph(new Run(i + ""));
            RTB_Main.Document.Blocks.Add(para);
        }
        TextRange richText = new TextRange(RTB_Main.Document.ContentStart, RTB_Main.Document.ContentEnd);
        string searchText = tb_Search.Text; // 1 to 9

        string tmpStr = richText.Text.Replace("\r\n", "....");

        int position = Regex.Match(tmpStr, searchText).Index;
        RTB_Main.CaretPosition = RTB_Main.Document.ContentStart;
        RTB_Main.CaretPosition = RTB_Main.CaretPosition.GetPositionAtOffset(position);
        RTB_Main.Focus();
    }

正如Maciek所指出的,存在影響計數的不可見格式化項。 我的代碼添加了一個反饋循環,因為我們能夠詢問真正的插入符號 position 是什么。 感覺很老套,但我找不到更好的東西。

public static void SetCaretPositionOfRichTextBoxToCharIndex(
    System.Windows.Controls.RichTextBox box, int charIndex)
{
    // RichTextBox contains many formattings, and they, although invisible, count
    // when setting CaretPosition. Calling GetPositionAtOffset with charIndex from
    // DocumentStart can be less than the necessary CaretPosition. This code
    // therefore has a feedback loop to see how much more offset is necessary.

    box.CaretPosition = box.CaretPosition.DocumentStart;
    int attemptedCharIndex = 0;
    int fixerInc = 0;
    while (attemptedCharIndex < charIndex)
    {
        box.CaretPosition = box.CaretPosition.GetPositionAtOffset(charIndex - attemptedCharIndex + fixerInc);
        int temp = new TextRange(box.Document.ContentStart, box.CaretPosition).Text.Length;
        if (attemptedCharIndex == temp)
        {
            fixerInc++;
        }
        else
        {
            fixerInc = 0
        }
        attemptedCharIndex = temp;
    }
}

暫無
暫無

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

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