如何使用.NET 6 WPF使用EPSON TM-T70II打印票据?

问题描述 投票:0回答:1

我正在尝试创建一个使用 .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”的项目,但没有任何内容。

我不需要任何打印机选择对话框;我想直接打印票。我该如何修改它以实现我的目标?

c# wpf .net-6.0
1个回答
0
投票

您可以通过将

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.