WPF PrintPreview 获取 DocumentPaginator 页面的 PageContent
WPF PrintPreview Get the PageContent of DocumentPaginator Pages
我想使用 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 的回答,但问题是它没有处理流文档的页面填充。
因此我写了自己的解决方案(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, 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 变量以从我的预览中调用方法 window 并且可以传递当前的打印机设置。
如果你从你的主程序调用它,你可以传递一个 new PrintDialog()
或 null
,没有区别,因为如果你传递 null
它会创建一个 new PrintDialog
对于具有不同类型文本(header、文本、字体)的 Flowdocument,这对我来说效果很好。
它应该适用于混合的图片和文本,或仅适用于图片 - 它使用的是视觉效果,而不是流文档中的特定内容,因此它也应该适用于分页符。
我没有尝试 Shahin Dohan 的回答,因为这是同样的问题。
它是在 MVVM 上写的,当别人写的时候很难理解。
在我看来,最好在没有 mvvm 的情况下编写一个小示例程序,人们可以将其熟悉 mvvm 或仅使用代码。
我了解 mvvm 的机会,但要向某人展示如何工作,我只看到缺点(如果您不展示特定的 mvvm 机制)
我想使用 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 的回答,但问题是它没有处理流文档的页面填充。
因此我写了自己的解决方案(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, 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 变量以从我的预览中调用方法 window 并且可以传递当前的打印机设置。
如果你从你的主程序调用它,你可以传递一个 new PrintDialog()
或 null
,没有区别,因为如果你传递 null
它会创建一个 new PrintDialog
对于具有不同类型文本(header、文本、字体)的 Flowdocument,这对我来说效果很好。
它应该适用于混合的图片和文本,或仅适用于图片 - 它使用的是视觉效果,而不是流文档中的特定内容,因此它也应该适用于分页符。
我没有尝试 Shahin Dohan 的回答,因为这是同样的问题。
它是在 MVVM 上写的,当别人写的时候很难理解。
在我看来,最好在没有 mvvm 的情况下编写一个小示例程序,人们可以将其熟悉 mvvm 或仅使用代码。
我了解 mvvm 的机会,但要向某人展示如何工作,我只看到缺点(如果您不展示特定的 mvvm 机制)