2

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

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

  • 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 英寸)。

我想过在画布周围使用一个视图框,它的宽度和高度设置为 830 x 580(A5 的比例正确),但这并没有帮助。

有什么建议么??

谢谢

4

2 回答 2

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;
        }
    }
}
于 2013-08-13T20:01:46.523 回答
0

我刚刚写完某种形式的设计器。这是我所做的:

我有一个用户控件,大小为 850x1100 单位(WPF 单位,但认为是“信纸大小的纸张 :)”),并且大小是固定的。我将我的控件放在我想要的任何地方,我将此控件显示在 Window 内的 Window 中ViewBox,它为我处理缩放它。这就像打印预览一样,效果很好。此外,WPF 图形都是用矢量完成的,因此缩放通常看起来不错。如果按比例放大,屏幕截图可能看起来不太好,但按比例缩小可能没问题。

下面的代码通过实例化我的 UserControl 的新实例(InspectionFormPrintView在下面的代码中)、设置它的 DataContext(它具有绑定数据)来执行打印,然后从打印驱动程序获取一些信息以正确调整它的大小。它也在 ViewBox 内 - 如果不是,它不会缩放,因为我的控件具有固定大小。

最后, Dispatcher.BeginInvoke 将实际打印排队。由于 WPF 如何布置控件,因此必须这样做(有关详细信息,请参阅我的问题为什么我需要调用 Dispatcher.BeginInvoke() 以允许视觉对象正确绑定?)。

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);
于 2013-08-13T20:31:05.467 回答