WPF打印XAML模板的FlowDocument时Table出现多余边框如何解决
问题原因
XAML中定义的Table继承了项目内的全局默认样式(定义在App.xaml、引入的资源字典中),即使手动设置了BorderThickness=0也被更高优先级的全局样式覆盖;而C#代码动态创建的Table不会加载对应上下文的默认样式,所以不会出现多余边框。
解决方案
方案1:直接修改XAML Table属性
优先将BorderBrush直接设为Transparent,不要使用StaticResource避免资源值错误,同时补充Padding、Margin为0清除额外边距,可选同步给TableRowGroup设置边框属性:
<Table x:Name="border" CellSpacing="0" BorderThickness="0" BorderBrush="Transparent" Background="White" Padding="0" Margin="0"> <!-- 原有Table内容 --> <TableRowGroup BorderThickness="0" BorderBrush="Transparent"> <!-- 原有行内容 --> </TableRowGroup> </Table>
方案2:添加局部样式强制覆盖全局设置
如果全局样式优先级太高无法通过属性直接覆盖,在Table内部添加局部资源重置所有相关元素的边框属性:
<Table x:Name="border" CellSpacing="0" Background="{StaticResource WhiteBg}"> <Table.Resources> <Style TargetType="{x:Type Table}"> <Setter Property="BorderThickness" Value="0"/> <Setter Property="BorderBrush" Value="Transparent"/> </Style> <Style TargetType="{x:Type TableRowGroup}"> <Setter Property="BorderThickness" Value="0"/> <Setter Property="BorderBrush" Value="Transparent"/> </Style> <Style TargetType="{x:Type TableRow}"> <Setter Property="BorderThickness" Value="0"/> <Setter Property="BorderBrush" Value="Transparent"/> </Style> </Table.Resources> <!-- 原有Table的其他内容 --> </Table>
方案3:代码层面强制重置边框
实例化模板后手动修改Table属性,彻底覆盖所有样式设置:
PrintDialog printDlg = new PrintDialog(); FlowDocument f = new TransferTemplate(vm).doc; // 新增:重置Table边框 var table = f.Blocks.OfType<Table>().FirstOrDefault(x => x.Name == "border"); if (table != null) { table.BorderThickness = new Thickness(0); table.BorderBrush = Brushes.Transparent; } f.ColumnWidth = printDlg.PrintableAreaWidth; IDocumentPaginatorSource dps = f; if ((bool)printDlg.ShowDialog()) { printDlg.PrintDocument(dps.DocumentPaginator, "flow doc"); }
内容的提问来源于stack exchange,提问作者Narmina Seyidzade
相关产品推荐
相关产品推荐

