我正在尝试创建一个使用 .NET 6 WPF 打印票据的程序。运行程序后,文档出现在打印队列中,但只打印一张空白页。我也尝试过使用普通打印机,情况是一样的。
以下是我的测试。
第一次测试。
FixedPage fixedPage = new FixedPage();
fixedPage.Width = 320;
fixedPage.Height = 267;
Style textStyle = new Style(typeof(TextBlock));
Setter sWeight = new Setter(TextBlock.FontWeightProperty, FontWeights.Bold);
textStyle.Setters.Add(sWeight);
Setter sFontColor = new Setter(TextBlock.ForegroundProperty, System.Windows.Media.Brushes.Black);
textStyle.Setters.Add(sFontColor);
TextBlock textBlock = new TextBlock();
textBlock.Text = content;
textBlock.FontSize = fontSize;
textBlock.Style = textStyle;
textBlock.FontFamily = new System.Windows.Media.FontFamily(fontFamily);
textBlock.SetValue(Canvas.LeftProperty, (double)x);
textBlock.SetValue(Canvas.TopProperty, (double)y);
fixedPage.Children.Add(textBlock);
PageContent pageContent = new PageContent();
((IAddChild)pageContent).AddChild(fixedPage);
FixedDocument fixedDocument = new FixedDocument();
fixedDocument.Pages.Add(pageContent);
PrintDialog printDialog = new PrintDialog();
printDialog.PrintDocument(fixedDocument.DocumentPaginator, "Ticket");
第二次测试。
FixedPage fixedPage = new FixedPage();
fixedPage.Width = 320;
fixedPage.Height = 267;
Style textStyle = new Style(typeof(TextBlock));
Setter sWeight = new Setter(TextBlock.FontWeightProperty, FontWeights.Bold);
textStyle.Setters.Add(sWeight);
Setter sFontColor = new Setter(TextBlock.ForegroundProperty, System.Windows.Media.Brushes.Black);
textStyle.Setters.Add(sFontColor);
TextBlock textBlock = new TextBlock();
textBlock.Text = content;
textBlock.FontSize = fontSize;
textBlock.Style = textStyle;
textBlock.FontFamily = new System.Windows.Media.FontFamily(fontFamily);
textBlock.SetValue(Canvas.LeftProperty, (double)x);
textBlock.SetValue(Canvas.TopProperty, (double)y);
fixedPage.Children.Add(textBlock);
PrintDialog printDialog = new PrintDialog();
printDialog.PrintVisual(fixedPage, "Ticket");
在打印机上,我可以在打印队列中看到名为“Ticket”的项目,但没有任何内容。
我不需要任何打印机选择对话框;我想直接打印票。我该如何修改它以实现我的目标?
您可以通过将
PrintDialog
与 LocalProntServer
一起使用来打印没有 XpsDocumentWriter
的文档。
关于代码的一些注释:
您应该考虑使用 XAML 来填充文档。使用 C# 创建样式和模板非常尴尬。您可以在 XAML 中定义
DataTemplate
和 ContentControl
。将样式添加到 ContentControl.Resources
字典中。所有这些都可以放入专用的 .xaml 文件中。 DataTemplate
定义文档布局,例如TextBlock
元素等。您可以使用 XamlReader
将 XAML 文本转换为对象,例如,将 ContentControl
标记转换为可以使用的 C# 对象。然后将表示文档内容的数据模型分配给 ContentControl.Content
属性并直接打印或将其添加到 FixedDocument
中。您绝对不应该在 C# 中创建任何可视化树,尤其是样式和模板。
IAddChild
是一个过时的界面。不要使用它。它随时可能从框架中删除。PageContent.Child
属性:
//((IAddChild)pageContent).AddChild(fixedPage);
pageContent.Child = fixedPage;
仅当附加元素是
Canvas.Top
的子元素时,使用附加的 Canvas.Left
和 Canvas
属性进行定位才相关。否则,对布局没有任何影响。//textBlock.SetValue(Canvas.LeftProperty, (double)x);
Canvas.SetLeft(textBlock, (double)x);
如何在没有
PrintDialog
的情况下打印的示例:
private void PrintDocument(FixedDocument document)
{
var printServer = new LocalPrintServer();
/*
* Select a destination printer using one of the following methods
*/
PrintQueue destinationPrinter;
// Method 1: filter the list of available printers
PrintQueueCollection availablePrinters = printServer.GetPrintQueues();
destinationPrinter = availablePrinters.First();
// Method 2: use the default printer
destinationPrinter = printServer.DefaultPrintQueue;
// Pick a particular printer by name e.g., the native PDF printer
string printerName = "Microsoft Print to PDF";
destinationPrinter = printServer.GetPrintQueue(printerName);
/*
* Start the printing
*/
// Create a XpsDocumentWriter that writes to the printer queue
XpsDocumentWriter documentWriter = PrintQueue.CreateXpsDocumentWriter(destinationPrinter);
// Handle the 'XpsDocumentWriter.WritingCompleted` event
// to continue code after writing has been completed.
// This is an event based asynchronous API.
documentWriter.WriteAsync(document);
}