WPF .NET5中FlowDocumentReader显示RichTextBox内容行空白过多问题
问题原因
- 你开启了
IsOptimalParagraphEnabled属性:该属性会让WPF自动调整段落内的字符间距、行断点,让段落左右边缘尽量对齐,过程中就会产生大量不规则的行内空白。 FlowDocument默认配置未适配:默认的PagePadding(页边距)、PageWidth(页宽)参数和RichTextBox的布局参数不匹配,页面宽度远大于内容实际需要的宽度时,就会出现行尾大量空白。- 段落样式不统一:
RichTextBox中Paragraph的默认边距、行高和FlowDocumentReader的默认段落样式不一致,复制内容时携带的原有样式和新容器布局规则冲突,也会产生多余空白。
遗漏的配置项
你没有对FlowDocument的布局参数、默认段落样式做针对性配置,也没有适配FlowDocumentReader不同浏览模式下的布局规则。
解决方案
1. 调整XAML中FlowDocument的配置
修改FlowDocument节点的属性,关闭不必要的最优布局、设置合理的页边距、绑定页宽到容器实际宽度,同时统一段落默认样式:
<FlowDocumentReader x:Name="fdReader" ScrollViewer.VerticalScrollBarVisibility="Auto" IsScrollViewEnabled="True"> <FlowDocument IsHyphenationEnabled="True" TextAlignment="Left" IsOptimalParagraphEnabled="False" PagePadding="5,5,5,5" PageWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=FlowDocumentReader}}"> <FlowDocument.Resources> <Style TargetType="Paragraph"> <Setter Property="Margin" Value="0"/> <Setter Property="LineHeight" Value="Double.NaN"/> </Style> </FlowDocument.Resources> </FlowDocument> </FlowDocument>
如果需要保留最优段落对齐的效果,可以保留IsOptimalParagraphEnabled="True",同时添加ColumnWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=FlowDocumentReader}}"属性,避免自动分栏产生空白。
2. 代码中迁移内容后统一重置段落样式(可选,更稳妥)
你也可以在加载完内容后,遍历所有段落统一重置样式,避免从RichTextBox中复制的旧样式影响布局:
private void btnTest_Click(object sender, RoutedEventArgs e) { var range = new TextRange(rtbTest.Document.ContentStart, rtbTest.Document.ContentEnd); if (!range.IsEmpty) { if(fdReader.Document.Blocks.Count > 0) fdReader.Document.Blocks.Clear(); using (var stream = new MemoryStream()) { range.Save(stream, DataFormats.XamlPackage); var copyto = new TextRange(fdReader.Document.ContentEnd, fdReader.Document.ContentEnd); copyto.Load(stream, DataFormats.XamlPackage); } // 新增:重置所有段落样式 foreach (var block in fdReader.Document.Blocks) { if (block is Paragraph para) { para.Margin = new Thickness(0); para.LineHeight = double.NaN; para.TextAlignment = TextAlignment.Left; } } } rtbTest.Visibility = Visibility.Collapsed; fdReader.Visibility = Visibility.Visible; }
修改后不同浏览模式下的多余空白都会消失,布局效果会和RichTextBox中的原始效果一致。
内容的提问来源于stack exchange,提问作者nam
相关产品推荐
相关产品推荐

