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ユニットですが、「レターサイズの紙:)」と思います)のUserControlがあり、サイズは固定されています。コントロールを必要な場所に配置し、このコントロールを 内の Window に表示し、ViewBoxスケーリングを処理します。これは印刷プレビューのように機能し、非常にうまく機能します。また、WPF グラフィックスはすべてベクターで行われるため、通常、スケーリングはかなり見栄えがよくなります。スクリーンショットは拡大すると見栄えが悪いかもしれませんが、縮小すると問題ないかもしれません。

以下のコードは、(次のコードで) UserControl の新しいインスタンスをインスタンス化し、InspectionFormPrintViewその DataContext を設定して (データがバインドされている)、印刷ドライバーから情報を取得して適切なサイズにすることで印刷を行います。これは ViewBox 内にもあります。そうでない場合、コントロールのサイズが固定されているため、スケーリングされません。

最後に、Dispatcher.BeginInvoke が実際の印刷をキューに入れます。これは、WPF がコントロールをレイアウトする方法のために行う必要があります (詳細については、私の質問への回答を参照してください)。

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 に答える