C#中如何使用RichTextBox.SelectionColor属性来识别多个文本的背景色?
How to use RichTextBox.SelectionColor property to identify multiple text's background colors in C#?
我有一个RichTextBox
。我正在尝试编码,以便如果在 RTB
的 SelectionBackColor
属性 中找到特定颜色,则要删除的单词/文本的背景颜色。为此,我需要检测 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
(成功)中只应用了一种颜色,
这是在 RTB
中仅应用一种颜色和一个空格的情况(失败),
这是在 RTB
(失败)中应用多种颜色和空格的情况,
那么,是否有任何方法可以覆盖 SelectionColor
属性 的 return 值以便能够检测多种颜色,或者是否有任何其他方法可以做到这一点?顺便说一句,我已经在网上搜索过此类问题,但我认为我没有找到任何相关问题。
我花了一段时间才弄明白@TaW 在评论部分的意思,但多亏了他,我才设法解决了这个问题。
其实根据我在评论区的回复问@TaW,我以为是同一个概念,其实是错误的。在上面的post中,我做的是完全错误的:
- 我应该一个一个地评估每个文本以了解它们的颜色是什么。但是,下面的代码一开始就错了。:
int startIndex = 0;
int endIndex = this.richTextBox1.TextLength;
this.richTextBox1.Select(startIndex, endIndex);
- 为了分析
RTB.SelectionColor
、RTB.SelectionStart
和 RTB.SelectionLength
的工作原理,我决定创建另一个项目。该项目是一个简单的程序,包含一个 RTB,以及一些其他用于管理 RTB SelectionColor
的按钮。如果你想查看我做过的项目,随时欢迎你访问 this link.
来自“2”,我re-used所有代码都适合我正在处理的原始项目。现在,一切正常,正常工作。
请注意,管理 Selection
属性 和 RTB
有两个重要的概念/想法。
- 如果您担心评估
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):
- 如果您真的不关心评估
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):
和平...✌️
我有一个RichTextBox
。我正在尝试编码,以便如果在 RTB
的 SelectionBackColor
属性 中找到特定颜色,则要删除的单词/文本的背景颜色。为此,我需要检测 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
(成功)中只应用了一种颜色,
这是在 RTB
中仅应用一种颜色和一个空格的情况(失败),
这是在 RTB
(失败)中应用多种颜色和空格的情况,
那么,是否有任何方法可以覆盖 SelectionColor
属性 的 return 值以便能够检测多种颜色,或者是否有任何其他方法可以做到这一点?顺便说一句,我已经在网上搜索过此类问题,但我认为我没有找到任何相关问题。
我花了一段时间才弄明白@TaW 在评论部分的意思,但多亏了他,我才设法解决了这个问题。
其实根据我在评论区的回复问@TaW,我以为是同一个概念,其实是错误的。在上面的post中,我做的是完全错误的:
- 我应该一个一个地评估每个文本以了解它们的颜色是什么。但是,下面的代码一开始就错了。:
int startIndex = 0;
int endIndex = this.richTextBox1.TextLength;
this.richTextBox1.Select(startIndex, endIndex);
- 为了分析
RTB.SelectionColor
、RTB.SelectionStart
和RTB.SelectionLength
的工作原理,我决定创建另一个项目。该项目是一个简单的程序,包含一个 RTB,以及一些其他用于管理 RTBSelectionColor
的按钮。如果你想查看我做过的项目,随时欢迎你访问 this link.
来自“2”,我re-used所有代码都适合我正在处理的原始项目。现在,一切正常,正常工作。
请注意,管理 Selection
属性 和 RTB
有两个重要的概念/想法。
- 如果您担心评估
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):
- 如果您真的不关心评估
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):
和平...✌️