C#中如何使用RichTextBox.SelectionColor属性来识别多个文本的背景色?

How to use RichTextBox.SelectionColor property to identify multiple text's background colors in C#?

我有一个RichTextBox。我正在尝试编码,以便如果在 RTBSelectionBackColor 属性 中找到特定颜色,则要删除的单词/文本的背景颜色。为此,我需要检测 RTB 中是否存在多种颜色。但是,根据 documentation

If the current text selection has more than one color specified, this property returns Color.Empty.


这是我目前尝试过的方法:

private void randomBtn_Click(object sender, EventArgs e)
{
    int startIndex = 0; //start from beginning of the richTextBox1
    int endIndex = this.richTextBox1.TextLength; //until the end of all text available
    this.richTextBox1.Select(startIndex, endIndex); //select from start until the end

    if(endIndex != 0)
    {
        for(int i=startIndex; i< endIndex; i++)
        {
            if (this.richTextBox1.Text[i].ToString().Contains(" ")) //skips white spaces
            {
                continue;
            }
            else
            {
                while ((this.richTextBox1.BackColor != Color.Empty))
                {
                    if (this.richTextBox1.SelectionBackColor.R == 155 && this.richTextBox1.SelectionBackColor.G == 255 && this.richTextBox1.SelectionBackColor.B == 255)
                    {
                        this.richTextBox1.HideSelection = true; //to prevent text highlighted
                        MessageBox.Show(this, "Texts with RGB(155, 255, 255) found!", "", MessageBoxButtons.OK);
                        break;
                    }
                    else
                    {
                        this.richTextBox1.HideSelection = true;
                        MessageBox.Show(this, "Error!", "", MessageBoxButtons.OK);
                        break;
                    }
                }
            }
        }
    }
    else
    {
        MessageBox.Show(this, "richTextBox1 is empty!", "Alert!", MessageBoxButtons.OK);
    }
}

为了测试,我在包含 while 行的代码处添加了一个断点。下面显示了成功和失败的标准,

代码在以下情况下有效:

如果出现以下情况,代码将失败:


程序执行示例如下:

这是在RTB(成功)中只应用了一种颜色,

这是在 RTB 中仅应用一种颜色和一个空格的情况(失败),

这是在 RTB(失败)中应用多种颜色和空格的情况,


那么,是否有任何方法可以覆盖 SelectionColor 属性 的 return 值以便能够检测多种颜色,或者是否有任何其他方法可以做到这一点?顺便说一句,我已经在网上搜索过此类问题,但我认为我没有找到任何相关问题。

我花了一段时间才弄明白@TaW 在评论部分的意思,但多亏了他,我才设法解决了这个问题。

其实根据我在评论区的回复问@TaW,我以为是同一个概念,其实是错误的。在上面的post中,我做的是完全错误的:

  1. 我应该一个一个地评估每个文本以了解它们的颜色是什么。但是,下面的代码一开始就错了。:

int startIndex = 0;
int endIndex = this.richTextBox1.TextLength;
this.richTextBox1.Select(startIndex, endIndex);

  1. 为了分析 RTB.SelectionColorRTB.SelectionStartRTB.SelectionLength 的工作原理,我决定创建另一个项目。该项目是一个简单的程序,包含一个 RTB,以及一些其他用于管理 RTB SelectionColor 的按钮。如果你想查看我做过的项目,随时欢迎你访问 this link.

来自“2”,我re-used所有代码都适合我正在处理的原始项目。现在,一切正常,正常工作。


请注意,管理 Selection 属性 和 RTB 有两个重要的概念/想法。

  1. 如果您担心评估 RTB 中的每一个文本,您应该这样编码:
private void methodA(RichTextBox localRTB)
{
    //go through text one by one
    int startIndex = 0;
    int endIndex = localRTB.TextLength;
    localRTB.SelectionStart = startIndex;
    localRTB.SelectionLength = 1; //always 1 'cuz we want to assess each text one by one

    while (localRTB.SelectionStart < endIndex)
    {
        //if the SelectionBackColor is red, change it to white
        if (localRTB.SelectionBackColor == Color.Red) //take red color for example
        {
            localRTB.SelectionBackColor = Color.White;
        }
        //--manage bg color of selected text in RTB--

        //so that able to go to next text
        localRTB.SelectionStart += 1;
    }

    //finally...
    localRTB.DeselectAll(); //unselect text in RTB
    localRTB.Select(); //set focus back to the RTB
}

下面显示了上述代码的结果(1):

  1. 如果您真的不关心评估 RTB 中的每一个文本,您应该改为这样编码:
private void methodB(RichTextBox localRTB)
{
    int startIndex;
    int endIndex;

    if (localRTB.SelectionLength.Equals(0)) //if user don't select any text
    {
        startIndex = 0; //from beginning of RTB
        endIndex = localRTB.TextLength; //'til the end of RTB

        //--manage selected text in the RTB--
        localRTB.SelectionStart = startIndex;
        localRTB.SelectionLength = endIndex;

        localRTB.Select(localRTB.SelectionStart, localRTB.SelectionLength);
        //--manage selected text in the RTB--
    }
    else if (!(localRTB.SelectionLength.Equals(0))) //if user has text selected
    {
        startIndex = localRTB.SelectionStart; //from beginning of RTB
        endIndex = localRTB.SelectionLength; //'til the end of RTB

        if (localRTB.SelectedText.Contains(" ")) //skips whitespaces if selected together with text
        {
            if (localRTB.SelectedText.EndsWith(" "))
            {
                endIndex -= 1;
            }
        }

        //--manage selected text in the RTB--
        localRTB.Select(startIndex, endIndex);
        //--manage selected text in the RTB--
    }
}

下面显示了上述代码的结果(2):

和平...✌️