C# WPF Richtextbox字体面/字体大小

C# WPF Richtextbox字体面/字体大小,c#,wpf,styles,richtextbox,C#,Wpf,Styles,Richtextbox,我目前正试图在WPF项目中创建一些基本的字处理器功能。我使用的是RichTextBox,我知道所有的编辑命令(ToggleBold、ToggleItalic…等等)。我一直坚持的一点是允许用户更改字体大小和字体面,就像在MS Office中,值仅针对选定的文本更改,如果没有选定的文本,则值将针对当前插入符号位置更改。我已经想出了一个相当多的代码来让这个工作,但我有问题,并没有选择文本的东西。下面是我为RichTextBox.Selection所做的操作 TextSelection text =

我目前正试图在WPF项目中创建一些基本的字处理器功能。我使用的是RichTextBox,我知道所有的编辑命令(ToggleBold、ToggleItalic…等等)。我一直坚持的一点是允许用户更改字体大小和字体面,就像在MS Office中,值仅针对选定的文本更改,如果没有选定的文本,则值将针对当前插入符号位置更改。我已经想出了一个相当多的代码来让这个工作,但我有问题,并没有选择文本的东西。下面是我为RichTextBox.Selection所做的操作

TextSelection text = richTextBox.Selection;
if (text.IsEmpty)
{
    //doing this will change the entire word that the current caret position
    //is on which is not the desire/expected result.
    text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value);
}
else
    //This works as expected.
    text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value);
所以我的问题是我应该怎么做?有更好/更方便的方法吗?我的一个想法是,我需要在段落中插入一个新的内联,但我不知道怎么做。感谢您的帮助。多谢各位


完整免责声明:这是对7个月前问题的准确回复。我在寻找完全相同问题的解决方案时发现了它,但是这个问题没有得到回答,我希望现在有人能够回答它。

试试这个:

private void ChangeTextProperty(DependencyProperty dp, string value)
            {
                if (mainRTB == null) return;
                TextSelection ts = mainRTB.Selection;
                if (ts.IsEmpty)
                {
                    TextPointer caretPos = mainRTB.CaretPosition;
                    TextRange tr = new TextRange(caretPos, caretPos);
                    tr.Text = " ";
                    tr.ApplyPropertyValue(dp, value);
                }
                else
                {
                    ts.ApplyPropertyValue(dp, value);
                }
            }

我希望它能成功

好的,刚刚找到答案:

 private void ChangeTextProperty(DependencyProperty dp, string value)
    {
        if (mainRTB == null) return;

        TextSelection ts = richTextBox.Selection;
        if (ts!=null)
            ts.ApplyPropertyValue(dp, value);
        richTextBox.Focus();
    }

您可以在将新值应用于TextRange后,通过调用其focus()方法显式地将焦点重新设置为RichTextBox,或者更好地使工具栏项不可聚焦。例如,如果有字体大小的组合框:

<ComboBox x:Name="FontSizeSelector" Focusable="False" />

我考虑过这个选项,但它在文本末尾添加了一个空格。如果我随后删除该空格,字体更改效果将消失。
text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value);