Winforms RichTextBox SelectionFont意外为*非*空

Winforms RichTextBox SelectionFont意外为*非*空,winforms,richtextbox,rtf,Winforms,Richtextbox,Rtf,我想在不删除粗体/斜体/下划线格式的情况下更改RTF块的字体大小(这个问题与中的问题类似)。公认的答案是修改文本框的选择,直到SelectionFont属性为null,以便找到可以单独修改的格式一致的文本。听起来很合理。但是,RichTextBox控件的实际行为似乎与文档不一致 在RichTextBox的文档中,选择fontMSDN说明: 如果当前文本选择指定了多个字体,则 属性为空 但是,此使用粗体/常规混合文本的代码的行为与您预期的不同: var rtb = new RichTextBox

我想在不删除粗体/斜体/下划线格式的情况下更改RTF块的字体大小(这个问题与中的问题类似)。公认的答案是修改文本框的选择,直到
SelectionFont
属性为null,以便找到可以单独修改的格式一致的文本。听起来很合理。但是,RichTextBox控件的实际行为似乎与文档不一致

RichTextBox的文档中,选择font
MSDN说明:

如果当前文本选择指定了多个字体,则 属性为空

但是,此使用粗体/常规混合文本的代码的行为与您预期的不同:

var rtb = new RichTextBox {
    Rtf = @"{\rtf1 This is \b bold\b0.}"
};

rtb.SelectAll();
// Now you'd expect rtb.SelectionFont to be null,
// but it actually returns a Font object

有没有其他可靠的方法来格式化文本,这样我就可以在不破坏其他格式的情况下更改字体大小。(直接操作RTF是可以的,我并不是绝对打算使用WinForms来实现这一点)。

我已经放弃了尝试使用WinForms来解决这个问题。当我将更改应用于整个文档(而不仅仅是一部分)时,直接修改RTF并不难

在本例中,我对字体大小感兴趣,它由
\fs
命令表示。因此,要将所有8.5pt文本替换为10pt文本,可以将
\fs17
替换为
\fs20
。(是的,RTF字体大小显然以半个点为单位)

这似乎工作得很好,尽管它确实感觉像是“让我们使用正则表达式来破坏HTML”类型的解决方案之一,所以我不认为它非常健壮。

看看这个:


我认为这是同一个问题。拉尔斯泰克的解决方案对我来说非常有效。

很痛苦。对于混合字体,而不仅仅是混合样式或大小,它为空。