2011-01-18 4 views
1

Мне нужно распечатать на указанном принтере (принтер с меткой цены) некоторые данные. Данные выглядят как штрих-код ean13, цена, название предмета и т. Д.wpf print/print preview usercontrol

У меня есть несколько настроек для печати в каждом случае. Что я хочу:

  • создать usercontrol (WPF) с 2 столбцами. левый столбец для предварительного просмотра печати и правый столбец для настроек (флажки, текстовые поля).
  • - это настройки пользовательских настроек, обновления предварительного просмотра.

Какой подход следует использовать, чтобы сделать это наиболее правильно? Теперь печать процедура выглядит следующим образом:

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? Спасибо. Как это можно сделать? Должен ли я использовать в XAML для предварительного просмотра печати

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

или? :)

Главный вопрос: как рисовать собственные вещи (текст, изображения и т. Д.) Для печати и печати в WPF.

+0

Должен ли я нарисовать желаемое изображение на холсте и использовать PrintVisual? – Lari13

ответ

0

Я попробовал этот подход:

  • в ViewModel, у меня есть открытое свойство PrintPreview (типа сетки)

  • в XAML у меня есть

    <ContentPresenter Content="{Binding Path=PrintPreview}" /> 
    
  • каждой из установок являются привязаны к свойствам ViewModel

  • в частная функция I contruct свойство PrintPreview выглядит следующим образом:

    PrintPreview.Children.Clear(); var title = new TextBlock {...}; PrintPreview.Children.Add (название); //и т.д.

  • Я «Печать» метод, который переплетен на кнопку «Печать» в целях:

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

Это работает, но я действительно не знаю, что хороший подход или нет ,