【问题标题】:Centering (verticaly) a row of text in a RichTextBox将 RichTextBox 中的一行文本居中(垂直)
【发布时间】:2013-06-06 11:52:50
【问题描述】:

我有一个 RichTextBox,它有时包含大量需要滚动才能看到的文本。加载/输入文本并单击按钮后,应用程序将逐步浏览文本,一次一个字符,进行更改。

我正在尝试滚动 RichTextBox 的内容,以将当前发生更改的行保持在框的中间。

我可以将插入符号移动到顶部和底部,这会将文本向下移动并将插入符号放在框的顶部或将其向上移动并将插入符号分别放在框的底部。

我可以将插入符号放置在给定字符上,但取决于该字符在文本的可见部分(文本框内)中的位置,插入符号可能位于框的顶部或底部附近,如何是否移动整个文本以使插入符号所在的行滚动到框的垂直中间?

希望这一切都有意义。

【问题讨论】:

  • 您是否尝试过简单地将 SelectionStart() 属性设置为正确的位置,然后调用 ScrollToCaret()?确保 RichTextBox 有焦点。
  • 实际上我只是回来说我也刚刚尝试过使用它。但是,对于包含 15,356 个字符的文本文件,此方法仅保证插入符号位于文本的可见部分。和以前一样,它可能位于顶线或底线,或介于两者之间的任何位置。我希望使用我的代码调整滚动,以便在滚动到插入符号后,我希望该行文本位于框的垂直中心。

标签: c# scroll richtextbox


【解决方案1】:

为了模拟“做出改变”,我一次只移动一个字符,以灰色突出显示文本。

您必须根据您的 UI(即您的 Richtextbox 的大小)更改“const int offset”的值。将其设置为控件垂直中点的字符数,即((RichTextBox 中的行数) / 2) * (每行的字符数)。我使用了一个 5 行文本框,每行大约 50 个字符,所以我将其设置为 100。

如果对您有帮助,请不要忘记接受答案。谢谢

    private void btnReset_Click(object sender, EventArgs e)
    {       
        richTextBox1.SelectAll();
        richTextBox1.SelectionBackColor = Color.White;
        richTextBox1.ScrollToCaret();
    }

    private void btnHighlight_Click(object sender, EventArgs e)
    {
        const int offset = 100;

        for (int i = 0; i < richTextBox1.TextLength; i++)
        {
            richTextBox1.Select(i, 1);
            richTextBox1.SelectionBackColor = Color.LightGray;

            if (i - offset > 0)
                richTextBox1.Select(i - offset, 1);
            else
                richTextBox1.Select(0, 1);

            richTextBox1.ScrollToCaret();

            Application.DoEvents();

            System.Threading.Thread.Sleep(50);

        }

    }

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 2015-09-16
    • 2015-09-10
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 2015-06-06
    相关资源
    最近更新 更多