我目前正在开发一个应用程序,用户可以在画布上动态创建/移动TextBlocks。一旦他们将TextBlocks定位在他们想要的位置,他们就可以按下打印按钮,这将导致ZPL打印机打印当前显示在屏幕上的内容。
通过从每个TextBlock中获取以下值来构建ZPL命令:
但是我找不到让打印输出类似于屏幕显示的方法。我想这是因为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的比例正确)但是这没有帮助。
有什么建议吗?
由于
答案 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);