【问题标题】:wpf print / print preview usercontrolwpf打印/打印预览用户控件
【发布时间】:2011-01-18 11:31:04
【问题描述】:

我必须打印到指定的打印机(价格标签打印机)一些数据。 数据看起来像 ean13 条形码、价格、商品名称等

我有一些设置在每种情况下要打印什么。 我想要什么:

  • 创建具有 2 列的用户控件 (WPF)。左列用于打印预览,右列用于设置(复选框、文本框)。
  • 是用户更改设置、打印预览更新。

我应该使用什么方法,以最正确的方式做到这一点? 现在打印例程如下所示:

private void DrawOnGraphics(Graphics graphics)
{
    using (var shF = new Font("Arial", 10, FontStyle.Bold))
    {
        graphics.DrawImage(_barcode, new Point(0, 0));
// etc...
}

我认为这不是很好的代码,但它可以在这里工作:

var pDoc = new PrintDocument();
pDoc.PrintPage += (a, e) =>
                              {
                                  DrawOnGraphics(e.Graphics);
                                  e.HasMorePages = false;
                              };
pDoc.Print();

我能否为这两种操作创建一个“渲染例程”:打印和打印预览? 谢谢。 如何做呢?我应该在 XAML 中使用打印预览吗

<Image Source="{Binding Path=PrintPreviewImage}" />

还是? :)

主要问题是:如何在 WPF 中为打印和打印预览绘制自己的东西(文本、图像等)。

【问题讨论】:

  • 我应该在画布上绘制想要的图像并使用 PrintVisual 吗?

标签: wpf printing print-preview


【解决方案1】:

我试过这种方法:

  • 在 ViewModel 中,我有公共属性 PrintPreview(网格类型)

  • 在 XAML 中我有

    <ContentPresenter Content="{Binding Path=PrintPreview}" />
    
  • 每个设置都绑定到 ViewModel 属性

  • 在私有函数中,我像这样构造 PrintPreview 属性:

    PrintPreview.Children.Clear(); var title = new TextBlock { ... }; PrintPreview.Children.Add(title); //等等。

  • 我有“打印”方法,绑定到视图中的“打印”按钮:

    PrintQueue pq = new PrintServer().GetPrintQueues(new[]
                                                         {
                                                             EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections
                                                         }).FirstOrDefault(tmp => tmp.FullName.Contains("MyPrintername"));
    
    if (pq == null)
    {
        MessageBox.Show("Please, setup printer");
        return;
    }
    
    var pt = new PrintTicket();
    // setting printticket
    pt.PageMediaSize = new PageMediaSize(FromMMtoPx(96, WidthInMm), FromMMtoPx(96, HeightInMm));
    pt.CopyCount = Copies;
    pt.PageResolution = new PageResolution(203, 203);
    pt.PageOrientation = PageOrientation.Portrait;
    pt.PageBorderless = PageBorderless.Borderless;
    
    var pDoc = new System.Windows.Controls.PrintDialog();
    pDoc.PrintQueue = pq;
    pDoc.PrintTicket = pt;
    
    // scale for whole printer page:
    
    var capabilities = pDoc.PrintQueue.GetPrintCapabilities(pDoc.PrintTicket);
    double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / PrintPreview.ActualWidth, capabilities.PageImageableArea.ExtentHeight / PrintPreview.ActualHeight);
    
    PrintPreview.LayoutTransform = new ScaleTransform(scale, scale);
    var sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
    PrintPreview.Measure(sz);
    PrintPreview.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));
    pDoc.PrintVisual(PrintPreview, "MyPrint");
    

它有效,但我真的不知道这是不是好方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多