#WPF,在使用PrintDialog.PrintDocument打印FlowDocument时,页面上的UI元素会消失的问题
我这里用了一个测试页来展示问题
页面上有一个FlowDocumentScrollViewer,里边是要打印的FlowDocument,
<FlowDocumentScrollViewer Grid.Row="1">
<FlowDocument Name="document">
<BlockUIContainer>
<RichTextBox Height="500">
</RichTextBox>
</BlockUIContainer>
</FlowDocument>
</FlowDocumentScrollViewer>
打印的代码也很简单
private void Button_Click(object sender, RoutedEventArgs e)
{
PrintDialog dialog = new PrintDialog();
if (dialog.ShowDialog() == true)
{
var paginator = ((IDocumentPaginatorSource)document).DocumentPaginator;
dialog.PrintDocument(paginator, "Print Test");
}
}
页面效果如下
点击按钮打印后,打印出的PDF是正常的,但是UI上的RichTextBox就消失了,
此时如果滚动滚动条,就会报错
System.NullReferenceException:“Object reference not set to an instance of an object.”
在 MS.Internal.PtsHost.FlowDocumentPage.UpdateViewport(FSRECT& viewport, Boolean drawBackground)
如果是调整窗口大小的话,元素就会重新显示出来,如下图,
<RichTextBox Name="richTB">
<FlowDocument>
<Paragraph TextIndent="20">
将 HTML 内容粘贴到 RichTextBox 应用程序中可能会导致意外行为,因为 RichTextBox 使用 RTF 格式,而不是直接使用 HTML 格式。
文本始终换行 。
<LineBreak/>
RichTextBox 如果不希望文字换行,请将 PageWidth on FlowDocument 设置为大于宽度 RichTextBox。 但是,到达页面宽度后,文本仍会换行。
</Paragraph>
<Paragraph>
<!--<Label>111</Label>
<CheckBox>1112</CheckBox>
<GroupBox Header="GroupBox"> </GroupBox>-->
<Run>Paragraph 2</Run>
</Paragraph>
<!--BlockUIContainer 块状容器 只支持一个子元素 如果需要多个标签 需要在最外面嵌入一个布局容器-->
<BlockUIContainer>
<StackPanel>
<Label>Paragraph 2</Label>
<CheckBox>1112</CheckBox>
</StackPanel>
</BlockUIContainer>
<!--实现数学公式 x的4次方+y的3次方 = 99 -->
<Paragraph FontSize="50">
<Run>x</Run>
<InlineUIContainer >
<Label Margin="-10,0,0,0" FontSize="30">4</Label>
</InlineUIContainer>
<Run>+</Run>
<Run>y</Run>
<InlineUIContainer >
<Label Margin="-10,0,0,0" FontSize="30">3</Label>
</InlineUIContainer>
<Run>=</Run>
<Run>99</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>