无法在wpf中打印具有较大用户控件元素的固定文档
本文关键字:元素 控件 用户 文档 wpf 打印 | 更新日期: 2023-09-27 18:07:51
我正在尝试打印用户控件。我将用户控件作为固定文档中的框架元素传递。当用户控件很大时,它不会被完全打印,只打印一页,其余内容被截断。我拿不到剩下的几页了。我需要在多个页面连续打印固定文档,而不截断内容。
public void PrintAllReceipts(object datatoprint, string resourceNameToUserControl)
{
var assembly = Assembly.GetEntryAssembly();
string resourceName = resourceNameToUserControl;
FrameworkElement elem;
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
elem = XamlReader.Parse(reader.ReadToEnd()) as FrameworkElement;
}
}
var data = datatoprint;
elem.DataContext = data;
//var pageSize = new Size(8.26 * 96, 11.69 * 96); // A4 page, at 96 dpi
//FixedDocument fixedDoc = new FixedDocument();
//PageContent pageContent = new PageContent();
//FixedPage fixedPage = new FixedPage();
//fixedDoc.DocumentPaginator.PageSize = pageSize;
//fixedPage.Width = pageSize.Width;
//fixedPage.Height = pageSize.Height;
//Create first page of document
//fixedPage.Children.Add(elem);
//fixedPage.Measure(pageSize);
//fixedPage.Arrange(new Rect(new Point(), pageSize));
//fixedPage.UpdateLayout();
//((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage);
//fixedDoc.Pages.Add(pageContent);
PrintDialog dial = new PrintDialog();
PrintContinuous(elem);
//List<FixedDocument > docss = GetFixedDocument(elem, dial);
//foreach (FixedDocument docs in docss)
//{
// dial.PrintDocument(docs.DocumentPaginator, "");
//}
// ShowPrintPreview(docss);
}
public static void PrintContinuous( FrameworkElement fe)
{
PrintDialog pd = new PrintDialog();
bool? result = pd.ShowDialog();
if (!result.HasValue || !result.Value) return;
fe.Dispatcher.Invoke(new Action(() =>
{
fe.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
fe.Arrange(new Rect(fe.DesiredSize));
fe.UpdateLayout();
}), System.Windows.Threading.DispatcherPriority.Render);
pd.PrintVisual(fe, ((String.IsNullOrWhiteSpace
(fe.Name) ? "Temp" : fe.Name) + " PRINT"));
}
你需要对视觉效果进行分页。
你可以将控件转换为位图,然后将位图分割成适合页面的部分,将页面添加到FixedDocument中,并使用PrintDialog.PrintDocument将其发送到打印机。
请参阅这篇相当长的CodeProject文章,它完全涵盖了所需的过程和代码: