You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中如何通过ComboBox仅修改RichTextBox选中文本的字号?

问题根源

你当前代码直接将RichTextBox控件级的FontSize属性绑定到选中字号属性,该属性的生效范围是整个控件内所有未单独设置格式的文本,因此字号变更时会覆盖全文档内容,无法仅作用于选中区域。

实现步骤
  1. 移除全局字号绑定
    首先删掉XAML中RichTextBox标签上的FontSize="{Binding SelectedFont, UpdateSourceTrigger=PropertyChanged}"这段全局绑定代码,避免控件级样式覆盖局部格式。

  2. 新增选中区域格式应用逻辑
    核心是操作RichTextBox自带的Selection文本选区对象,仅对选区内容应用字号设置,该逻辑和常规富文本编辑器行为一致:存在选中文本时仅修改选中文本字号,无选中文本时设置会生效到光标位置后续输入的新文本,不会改动已有内容。

你可以直接通过ComboBox的选择变更事件实现,修改后的XAML代码如下:

<ToolBar Background="#0E8F88" Style="{DynamicResource ToolBarStyle}"
         Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right">
    <ComboBox x:Name="fontsCombo" ItemsSource="{Binding FontSizes}"
              SelectedItem="{Binding SelectedFont, UpdateSourceTrigger=PropertyChanged}"
              SelectionChanged="fontsCombo_SelectionChanged">
    </ComboBox>
</ToolBar>

<RichTextBox Tag="Überschrift" x:Name="tb_1" FontWeight="{Binding bold1}" 
             FontStyle="{Binding italicCode2}" AcceptsTab="True"
             Grid.Row="1" Visibility="{Binding disableGray, UpdateSourceTrigger=PropertyChanged}" 
             HorizontalAlignment="Center" Margin="10 0 10 0" LostFocus="tb_1_LostFocus">
</RichTextBox>

在MainWindow的后台代码MainWindow.xaml.cs中添加事件处理逻辑:

private void fontsCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (fontsCombo.SelectedItem is int targetSize && tb_1 != null)
    {
        // 仅给选中区域应用字号
        tb_1.Selection.ApplyPropertyValue(TextElement.FontSizeProperty, (double)targetSize);
    }
}
扩展说明
  • 如果你需要严格遵循MVVM模式不写后台事件,可以通过附加属性、EventToCommand等方式,将ComboBox的选中事件绑定到ViewModel命令,把RichTextBox的Selection对象作为参数传入,执行同样的ApplyPropertyValue逻辑即可。
  • 你现有代码中绑定的FontWeight、FontStyle等格式属性如果也需要实现“仅修改选中文本”的效果,都可以复用这套逻辑,不要绑定RichTextBox的全局对应属性,改为在属性变更时对选区调用ApplyPropertyValue设置对应依赖项属性即可。

内容的提问来源于stack exchange,提问作者Dr.rektalius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:01:14