繁体   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