我目前正在尝试在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问题的确切转贴。我在寻找完全相同的问题的解决方案时找到了它,但是这个问题没有得到解答,我希望有人能够现在回答它。
答案 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();
}