WPF中如何通过ComboBox仅修改RichTextBox选中文本的字号?
问题根源
你当前代码直接将RichTextBox控件级的FontSize属性绑定到选中字号属性,该属性的生效范围是整个控件内所有未单独设置格式的文本,因此字号变更时会覆盖全文档内容,无法仅作用于选中区域。
实现步骤
移除全局字号绑定
首先删掉XAML中RichTextBox标签上的FontSize="{Binding SelectedFont, UpdateSourceTrigger=PropertyChanged}"这段全局绑定代码,避免控件级样式覆盖局部格式。新增选中区域格式应用逻辑
核心是操作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
相关产品推荐
相关产品推荐

