2011-01-18 129 views
1

私は特定のプリンタ(価格ラベルプリンタ)に何らかのデータを印刷する必要があります。 データはean13のバーコード、価格、商品のタイトルなどと似ていますwpf印刷/印刷プレビューusercontrol

それぞれの場合に何を印刷するか設定しています。 私が欲しいもの:

  • 2つの列でusercontrol(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(); 

は、私は両方のアクションのための1つの「レンダリングルーチン」を作成することができます。プリントとprintpreview?おかげさまで どうすればできますか?私は、印刷プレビュー

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

かのためにXAMLで使用する必要がありますか? :)

主な質問は、WPFで印刷と印刷プレビューのための自分のもの(テキスト、画像など)を描画する方法です。

+0

キャンバスに希望の画像を描画し、PrintVisualを使用する必要がありますか? – Lari13

答えて

0

私はこのアプローチを試みた:ビューモデルにおける

  • を、Iは、XAMLで(タイプグリッドの)パブリックプロパティPrintPreviewを

  • を有する私は設定のそれぞれ

    <ContentPresenter Content="{Binding Path=PrintPreview}" /> 
    
  • を有しますViewModelプロパティにバインドされました

  • プライベート関数私はこのようにPrintPreviewプロパティを設定します:

    PrintPreview.Children.Clear(); var title =新しい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"); 
    

それは動作しますが、私は本当に知らない、良い方法かどうかということです。