【问题标题】:Check if selected text on richtextbox is not all bold or mixed [C#] [duplicate]检查richtextbox上的选定文本是否全部为粗体或混合[C#] [重复]
【发布时间】:2016-10-15 03:24:38
【问题描述】:

如何检查是否在richtextbox上选择了文本

它的字符并不全是粗体。

例如:

notboldboldnotbold ← 这是混合的。
我不全是粗体←这不是全粗体

这是我编写的代码,它检查richtextbox上的选定文本是否包含一些粗体文本。
它的速度很慢,因为它使用Selection.Start到Selection.Length并检查如果粗体。如果我使用richTextBox1.SelectionFont.Bold,它将返回 false,因为它并非全部为粗体,这也意味着如果它混合了粗体而不是粗体。

bool notallbold = true;
int start = richTextBox1.SelectionStart;
int end = richTextBox1.SelectionLength;
for (int i = 1; i < end; i++)
{
    richTextBox1.SelectionStart = start+i;
    richTextBox1.SelectionLength = 1;
    if (richTextBox1.SelectionFont.Bold)
    {
        notallbold = false;
        richTextBox1.SelectionStart = 0;
        richTextBox1.SelectionLength = 0;
        richTextBox1.SelectionStart = start;
        richTextBox1.SelectionLength = end;
        richTextBox1.Focus();
    }
}

检查长字符串时,我可以看到文本在检查时变粗了。 还有比这更有效的方法吗?

【问题讨论】:

  • 我们可以假设所有选定的文本都使用相同的字体吗?因为如果选中的文本包含不止一种字体,SelectionFont 会返回 null。
  • @RezaAghaei - 加粗会使其成为不同的字体,是吗?
  • @Clockwork-Muse 一般来说是不同风格的字体是不同的,但是这里正如SelectionFont文档中提到的,如果当前文本选择有多个指定的字体,这个属性是空。 .我测试过,如果具有单个字体系列的文本包含一些具有不同样式的部分,则该属性不为空,这意味着控件决定使用字体系列名称。这就是为什么我说它是相同的字体。
  • @RezaAghaei - .... :headdesk: .... 所以,尽管这两种字体在后端被认为不相等(即,实际上有两个 Font 实例和 @987654329 @ 返回 false),它会愉快地返回一个(大概是开始时的样式)。好吧,二分搜索的想法就出现了。
  • 值得一读this postthis one。您可以继续您的方式,只需关闭重绘控制或使用另一个不可见的实例以获得更好的性能。

标签: c# .net winforms richtextbox


【解决方案1】:

在 RTF 文本中,\b 表示文本粗体部分的开始。所以可以先检查richTextBox1.SelectionFont.Bold是否为真,则表示文本全部为粗体,否则,如果选中的rtf中包含\b,则表示内容是混合的,否则选中的文本中没有粗体:

private void button1_Click(object sender, EventArgs e)
{
    if (richTextBox1.SelectionFont == null)
        return;
    if (richTextBox1.SelectionFont.Bold)
        MessageBox.Show("All text is Bold");
    else if (richTextBox1.SelectedRtf.Replace(@"\\", "").IndexOf(@"\b") > -1)
        MessageBox.Show("Mixed Content");
    else
        MessageBox.Show("Text doesn't contain Bold");
}

要测试解决方案,只需使用以下值初始化 RichtextBox

this.richTextBox1.SelectedRtf = @"{\rtf1\fbidis\ansi\ansicpg1256\deff0\deflang1065" +
    @"{\fonttbl{\f0\fnil\fcharset0 Calibri;}}\uc1\pard\ltrpar" +
    @"\lang9\b\f0\fs22 T\b0 his is a \b test}";

【讨论】:

  • 如果有多种字体,选择字体将为空,因此可能是混合内容。另外,最好不要先替换所有转义字符....
  • @Clockwork-Muse 我并不认为它是最好的解决方案,但它适用于所选文本使用相同字体名称的所有情况。关于Replace(@"\\", "") 这是因为"\\b" 不应被视为粗体的开始。需要更好解决方案的用户可以使用 RTF 解析器或等待更好的解决方案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多