如何解决WPF PrintPreview获取DocumentPaginator页面的页面内容
我想使用DocumentViewer
为更大的文本编写自己的PrintPreview,以便以后显示。
我没有找到对我的问题有用的东西。
目前,我正在寻找一种获取各个页面内容的方法。 我找到了一种访问各个页面的方法,但是我无法存储或获取它。
使用代码:
DocumentPaginator dpPages = (DocumentPaginator)((IDocumentPaginatorSource)twhtTemp.BuildTemplateControl(txtHeader,txtContent,pdlgPrint)).DocumentPaginator;
dpPages.ComputePageCount();
var fixedDocument = new FixedDocument();
for (int iPages= 0; iPages < dpPages.PageCount; iPages++)
{
var pageContent = new PageContent();
var fixedPage = new FixedPage();
fixedPage.Width = pdlgPrint.PrintableAreaWidth;
fixedPage.Height = pdlgPrint.PrintableAreaHeight;
pageContent.Child = fixedPage;
fixedDocument.Pages.Add(pageContent);
}
我已经为每个现有页面添加了一个新页面,但是我无法获取该页面的内容。
到目前为止,我知道我需要将UIElement
添加到fixedPage.Children
中。
还是有一些更简便的方法将flowdocument
插入到具有许多固定页数(取决于页数)的固定文档中?
解决方法
我讨厌回答我自己的问题。
搜索三天后,我在这里问。
一天后,我找到了办法...
回答问题已有很长时间了。
我尝试了杜达(Doo Dah)的答案,但问题是它没有处理flowdocument的页面填充。
因此,我编写了自己的解决方案(Doo Dah的回答帮助我完成了该解决方案):
public FixedDocument Get_Fixed_From_FlowDoc(FlowDocument flowDoc,PrintDialog printDlg)
{
var fixedDocument = new FixedDocument();
try
{
if (printDlg != null)
{
pdlgPrint = printDlg;
}
if (pdlgPrint == null)
{
pdlgPrint = new PrintDialog();
}
DocumentPaginator dpPages = (DocumentPaginator)((IDocumentPaginatorSource)flowDoc).DocumentPaginator;
dpPages.ComputePageCount();
PrintCapabilities capabilities = pdlgPrint.PrintQueue.GetPrintCapabilities(pdlgPrint.PrintTicket);
for (int iPages= 0; iPages < dpPages.PageCount; iPages++)
{
var page = dpPages.GetPage(iPages);
var pageContent = new PageContent();
var fixedPage = new FixedPage();
Canvas canvas = new Canvas();
VisualBrush vb = new VisualBrush(page.Visual);
vb.Stretch = Stretch.None;
vb.AlignmentX = AlignmentX.Left;
vb.AlignmentY = AlignmentY.Top;
vb.ViewboxUnits = BrushMappingMode.Absolute;
vb.TileMode = TileMode.None;
vb.Viewbox = new Rect(0,capabilities.PageImageableArea.ExtentWidth,capabilities.PageImageableArea.ExtentHeight);
FixedPage.SetLeft(canvas,0);
FixedPage.SetTop(canvas,0);
canvas.Width = capabilities.PageImageableArea.ExtentWidth;
canvas.Height = capabilities.PageImageableArea.ExtentHeight;
canvas.Background = vb;
fixedPage.Children.Add(canvas);
fixedPage.Width = pdlgPrint.PrintableAreaWidth;
fixedPage.Height = pdlgPrint.PrintableAreaHeight;
pageContent.Child = fixedPage;
fixedDocument.Pages.Add(pageContent);
}
dv1.ShowPageBorders = true;
}
catch (Exception)
{
throw;
}
return fixedDocument;
}
您必须构建一个FlowDocument,将之前显示的内容传递给它
方法。
添加了PrintDialog变量以从我的预览窗口调用方法,并可以传递当前的打印机设置。
如果从主程序调用它,则可以传递new PrintDialog()
或null
,没有区别,因为如果传递new PrintDialog
,它将创建一个null
。
这对使用带有不同类型的文本(标题,文本,字体)的Flowdocument来说对我来说很好。
它应该使用混合了图片和文字的图片,也可以只使用图片-使用视觉效果,而不是流程文档中的特定内容,因此它也应该使用分页符。
我没有尝试使用Shahin Dohan的答案,因为它经常遇到相同的问题。
它是用MVVM编写的,很难理解别人是何时写的。
在我看来,最好编写一个没有mvvm的小示例程序,人们可以将其熟练地应用于mvvm或仅使用代码。
我了解mvvm的机会,但向某人展示如何工作的方法,我只会看到缺点(如果您不会显示特定的mvvm机制)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。