WPF Richtextbox FontFace / FontSize

时间:2009-10-19 07:01:33

标签: c# wpf styles richtextbox

我目前正在尝试在WPF项目中创建一些基本的文字处理器功能。我正在使用RichTextBox并且知道所有的EditingCommands(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个月前this问题的确切转贴。我在寻找完全相同的问题的解决方案时找到了它,但是这个问题没有得到解答,我希望有人能够现在回答它。

3 个答案:

答案 0 :(得分:2)

试试这个:

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);
                }
            }

我希望它能解决问题

答案 1 :(得分:1)

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

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

然后您可以使用原始代码,而无需调用Focus():

text.ApplyPropertyValue(RichTextBox.FontSizeProperty, value);

答案 2 :(得分:0)

好的,刚刚找到答案:

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

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