1

指定したプリンター(価格ラベルプリンター)にデータを印刷する必要があります。データは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();

印刷とprintpreviewの両方のアクションに対して1つの「レンダリングルーチン」を作成できますか?ありがとう。どのようにそれを行うことができますか?印刷プレビューにXAMLで使用する必要があります

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

また?:)

主な質問は、WPFで印刷およびprintpreview用に独自のもの(テキスト、画像など)を描画する方法です。

4

1 に答える 1

0

私はこのアプローチを試しました:

  • 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");
    

それは機能しますが、私にはよくわかりませんが、それが良いアプローチかどうかはわかりません。

于 2011-01-19T13:56:52.917 に答える