2011-01-18 3 views
1

Je dois imprimer sur une imprimante spécifiée (imprimante d'étiquettes de prix) certaines données. Les données ressemblent au code-barres ean13, au prix, au titre de l'article, etc.wpf imprimer/imprimer aperçu usercontrol

J'ai quelques paramètres à imprimer dans chaque cas. Ce que je veux:

  • créer usercontrol (WPF) avec 2 colonnes. colonne de gauche pour l'aperçu avant impression et colonne de droite pour les paramètres (cases à cocher, zones de texte).
  • est l'utilisateur change les paramètres, les mises à jour d'aperçu avant impression.

Quelle approche dois-je utiliser, pour le faire le plus correctement? Maintenant impression ressemble la routine comme:

private void DrawOnGraphics(Graphics graphics) 
{ 
    using (var shF = new Font("Arial", 10, FontStyle.Bold)) 
    { 
     graphics.DrawImage(_barcode, new Point(0, 0)); 
// etc... 
} 

Je pense que ce n'est pas très bon code, mais il fonctionne ici:

var pDoc = new PrintDocument(); 
pDoc.PrintPage += (a, e) => 
           { 
            DrawOnGraphics(e.Graphics); 
            e.HasMorePages = false; 
           }; 
pDoc.Print(); 

Puis-je créer un « rendu de routine » pour les deux actions: l'impression et PrintPreview? Merci. Comment cela peut-il être fait? Dois-je utiliser en mode XAML pour l'aperçu avant impression

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

ou? :)

La question principale est: comment dessiner des choses propres (texte, images, etc) pour print et printpreview dans WPF.

+0

Est-ce que je devrais dessiner l'image désirée sur la toile et utiliser PrintVisual? – Lari13

Répondre

0

J'ai essayé cette approche:

  • dans ViewModel, j'ai biens publics PrintPreview (de type grille)

  • en XAML j'ai

    <ContentPresenter Content="{Binding Path=PrintPreview}" /> 
    
  • chacun des paramètres sont lié aux propriétés ViewModel

  • dans fonction privée Je construis la propriété PrintPreview comme ceci:

    PrintPreview.Children.Clear(); var title = new TextBlock {...}; PrintPreview.Children.Add (titre); //etc.

  • J'ai méthode « Imprimer », qui est binded à bouton « Imprimer » en vue:

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

Il fonctionne, mais je ne sais pas vraiment, est que la bonne approche ou non .