wpf print / print Предварительный просмотр usercontrol - PullRequest
1 голос
/ 18 января 2011

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

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

  • создать 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();

Могу ли я создать одну «процедуру рендеринга» для обоих действий: print иPrintPreview?Благодарю.Как это можно сделать?Должен ли я использовать в XAML для предварительного просмотра

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

или?:)

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

1 Ответ

0 голосов
/ 19 января 2011

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

  • в ViewModel, у меня есть публичное свойство PrintPreview (типа Grid)

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

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

  • в частной функции я создаю свойство PrintPreview так:

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

  • У меня есть метод «Печать», привязанный к кнопке «Печать»:

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

Этоработает, но я не знаю, хороший это подход или нет.

...