如何在具有特定格式的 RichTextBox 中搜索单词?
How to search a word in a RichTextBox having specific format?
我有一个 RichTextBox,用户可以在其中从 MS Word 复制粘贴 MCQ 测验问题。
正确的选择将被突出显示或以粗体显示
文本(例如在图像中突出显示)。
因此,我需要通过搜索特定格式来检查哪个选项是正确的(正确的选择并不总是位于固定位置,因此它可能是 4 个选项中的任何一个)。
我尝试了什么:
Find()
方法(没有帮助,因为它处理的是文本而不是格式)
- 得到每个单词的格式,但我真的不知道我应该在哪里更努力地尝试。
只是根据您在此处描述的具体情况提出的建议。
当您粘贴文本时,RTB 的 SelectionFont
属性 可以告诉您字体是否使用 FontStyle.Bold
.
如果文本突出显示(选择的背景颜色与控件的背景颜色不同),SelectionBackColor
属性可以return这个值。
请注意,评估整行的样式。如果样式应用于一行中的部分文本,则必须相应地更改代码。
您也可以使用 Lines[]
属性;我通常会避免 属性,尽管在这种情况下它不会以任何方式影响性能)。根据您的喜好更改代码。
在示例中,代码读取每一行文本,创建一个选区并要求控件阐明选区中的文本是否使用粗体字体样式及其背景颜色。
结果打印到输出 Window,但您可以使用例如 Dictionary<int, [Enum]>
(其中枚举数可以是 Regular
、Bold
、Highlighted
、 BoldHighlighted
等),Key 是行号。
或 List<class>
或您认为适合存储此信息的任何内容。
假设 RichTextBox 控件命名为 rtbLines
:
int currentLine = 0;
int textLength = rtbLines.TextLength;
int selStart = rtbLines.SelectionStart;
while (true) {
int lineFirstChar = rtbLines.GetFirstCharIndexFromLine(currentLine);
if (lineFirstChar < 0) break;
int nextLineFirstChar = rtbLines.GetFirstCharIndexFromLine(currentLine + 1);
int selLength = nextLineFirstChar >= 0
? nextLineFirstChar - lineFirstChar - 2 // Last char of the current line
: textLength - lineFirstChar; // Last line
if (selLength > 0) {
rtbLines.SelectionStart = lineFirstChar;
rtbLines.SelectionLength = selLength;
bool fontBold = rtbLines.SelectionFont.Style.HasFlag(FontStyle.Bold);
bool highLighted = rtbLines.SelectionBackColor != rtbLines.BackColor;
Console.WriteLine($"Line: {currentLine} IsBold: {fontBold} IsHighlighted: {highLighted}");
}
currentLine++;
}
rtbLines.SelectionStart = selStart;
我有一个 RichTextBox,用户可以在其中从 MS Word 复制粘贴 MCQ 测验问题。
正确的选择将被突出显示或以粗体显示
文本(例如在图像中突出显示)。
因此,我需要通过搜索特定格式来检查哪个选项是正确的(正确的选择并不总是位于固定位置,因此它可能是 4 个选项中的任何一个)。
我尝试了什么:
Find()
方法(没有帮助,因为它处理的是文本而不是格式)- 得到每个单词的格式,但我真的不知道我应该在哪里更努力地尝试。
只是根据您在此处描述的具体情况提出的建议。
当您粘贴文本时,RTB 的 SelectionFont
属性 可以告诉您字体是否使用 FontStyle.Bold
.
如果文本突出显示(选择的背景颜色与控件的背景颜色不同),SelectionBackColor
属性可以return这个值。
请注意,评估整行的样式。如果样式应用于一行中的部分文本,则必须相应地更改代码。
您也可以使用 Lines[]
属性;我通常会避免 属性,尽管在这种情况下它不会以任何方式影响性能)。根据您的喜好更改代码。
在示例中,代码读取每一行文本,创建一个选区并要求控件阐明选区中的文本是否使用粗体字体样式及其背景颜色。
结果打印到输出 Window,但您可以使用例如 Dictionary<int, [Enum]>
(其中枚举数可以是 Regular
、Bold
、Highlighted
、 BoldHighlighted
等),Key 是行号。
或 List<class>
或您认为适合存储此信息的任何内容。
假设 RichTextBox 控件命名为 rtbLines
:
int currentLine = 0;
int textLength = rtbLines.TextLength;
int selStart = rtbLines.SelectionStart;
while (true) {
int lineFirstChar = rtbLines.GetFirstCharIndexFromLine(currentLine);
if (lineFirstChar < 0) break;
int nextLineFirstChar = rtbLines.GetFirstCharIndexFromLine(currentLine + 1);
int selLength = nextLineFirstChar >= 0
? nextLineFirstChar - lineFirstChar - 2 // Last char of the current line
: textLength - lineFirstChar; // Last line
if (selLength > 0) {
rtbLines.SelectionStart = lineFirstChar;
rtbLines.SelectionLength = selLength;
bool fontBold = rtbLines.SelectionFont.Style.HasFlag(FontStyle.Bold);
bool highLighted = rtbLines.SelectionBackColor != rtbLines.BackColor;
Console.WriteLine($"Line: {currentLine} IsBold: {fontBold} IsHighlighted: {highLighted}");
}
currentLine++;
}
rtbLines.SelectionStart = selStart;