用于打印的实际尺寸WPF控件

时间:2013-08-13 19:56:01

标签: c# wpf printing dpi zpl

我目前正在开发一个应用程序,用户可以在画布上动态创建/移动TextBlocks。一旦他们将TextBlocks定位在他们想要的位置,他们就可以按下打印按钮,这将导致ZPL打印机打印当前显示在屏幕上的内容。

通过从每个TextBlock中获取以下值来构建ZPL命令:

  • XPosition = Canvas.Left
  • YPosition = Canvas.Right
  • 文字=文字

但是我找不到让打印输出类似于屏幕显示的方法。我想这是因为Canvas.Left和Canvas.Right的值与打印机DPI不匹配。

这是我目前正在使用的转换(因为我认为Canvas.Left = 1表示1/96英寸)(画布的左上角是0,0)

public double GetZplXPosition(UIElement uiElement)
{
    int dpiOfPrinter = 300;
    double zplXPosition = (Canvas.GetLeft(uiElement) / 96.0) * dpiOfPrinter;
    return zplXPosition;
}

我可以在“实际尺寸”中显示控件吗?正在使用的纸张将始终为A5(8.3英寸x 5.8英寸)。

我考虑在Canvas周围使用一个视图框,其宽度和高度设置为830 x 580(A5的比例正确)但是这没有帮助。

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:6)

取代您正在做的事情,拍摄整个画布的“屏幕截图”并打印出来。

using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace ImageProcessing
{
    public class ImageProc
    {
        public RenderTargetBitmap GetImage(UIElement source)
        {
            double actualHeight = source.RenderSize.Height;
            double actualWidth = source.RenderSize.Width;

            if (actualHeight > 0 && actualWidth > 0)
            {
                RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)actualWidth, (int)actualHeight, 96, 96, PixelFormats.Pbgra32);
                VisualBrush sourceBrush = new VisualBrush(source);

                DrawingVisual drawingVisual = new DrawingVisual();
                DrawingContext drawingContext = drawingVisual.RenderOpen();
                drawingContext.DrawRectangle(sourceBrush, null, new Rect(0, 0, actualWidth, actualHeight));
                drawingContext.Close();

                renderTarget.Render(drawingVisual);
                return renderTarget;
            }
            else
                return null;
        }
    }
}

答案 1 :(得分:0)

我刚刚写完了各种各样的表单设计师。这是我做的:

我有一个UserControl,大小为850x1100(WPF单位,但想想“letter letter paper”),并且大小是固定的。我把控件放在我想要的地方,我在ViewBox内的一个窗口中显示这个控件,它为我处理缩放。这就像打印预览一样,效果很好。此外,WPF图形都是使用矢量完成的,因此缩放通常看起来非常好。如果按比例放大,屏幕截图可能看起来不太好,但按比例缩小可能可以。

下面的代码通过实例化我的UserControl的新实例(以下代码中的InspectionFormPrintView)进行打印,设置其DataContext(它具有绑定数据),然后从打印驱动程序获取一些信息以调整大小正常。它也在ViewBox中 - 如果没有,它将无法扩展,因为我的控件具有固定的大小。

最后,Dispatcher.BeginInvoke将实际打印排队。必须这样做是因为WPF如何布局控件(有关详细信息,请参阅我的问题Why do I need to call Dispatcher.BeginInvoke() to allow a visual to properly bind before printing?的答案)。

var dlg = new PrintDialog();
var result = dlg.ShowDialog();
if (result == null || !(bool)result)
    return;

var page = new Viewbox { Child = new InspectionFormPrintView { DataContext = this.DataContext } };

page.Measure(new Size(dlg.PrintableAreaWidth, dlg.PrintableAreaHeight));
page.Arrange(new Rect(new Point(0, 0), page.DesiredSize));

Dispatcher.BeginInvoke(new Action(() => dlg.PrintVisual(page, "UnitHistory Inspection Form")), DispatcherPriority.ApplicationIdle, null);