Проблема печати WPF - PullRequest
       5

Проблема печати WPF

4 голосов
/ 25 января 2011

Когда я выбираю Microsoft XPS Document Writer в качестве принтера, мой вывод получается идеальным, но когда я выбираю принтер HP 1020, принтер выводит чистую копию ... Ниже приведен код ....

private void printButton_Click(object sender, RoutedEventArgs e)
    {
        PrintInvoice pi = new PrintInvoice();
        pi.DataContext = this.DataContext;
        PrintDialog printDlg = new System.Windows.Controls.PrintDialog();
        if (printDlg.ShowDialog() == true)
        {
            pi.Margin = new Thickness(30);

            //now print the visual to printer to fit on the one page.
            printDlg.PrintVisual(pi, "First Fit to Page WPF Print");
        }
    }

Ответы [ 2 ]

8 голосов
/ 25 января 2011

Это может быть вызвано множеством разных вещей. Вы можете добавить несколько шагов, которые при правильном выполнении могут заставить летчиков вернуться с товарами и знаниями.

Сначала вы должны масштабироваться до напечатанной страницы (код от a2zdotnet ):

System.Printing.PrintCapabilities capabilities = 
    printDlg.PrintQueue.GetPrintCapabilities(printDlg.PrintTicket);

 //get scale of the print wrt to screen of WPF visual
 double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / this.ActualWidth, capabilities.PageImageableArea.ExtentHeight /
                this.ActualHeight);

 //Transform the Visual to scale
 this.LayoutTransform = new ScaleTransform(scale, scale);

 //get the size of the printer page
 Size sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);

 //update the layout of the visual to the printer page size.
 this.Measure(sz);
 this.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));

  //now print the visual to printer to fit on the one page.
  printDlg.PrintVisual(this, "Code ganked from http://www.a2zdotnet.com/View.aspx?id=66");

Код груза-культа находится в шагах "Измерить и расположить". Часто, если вы звоните в Measure и передаете new Size(Double.MaxValue, Double.MaxValue), это все, что вам нужно сделать.

Второй ритуал включает столкновение с Диспетчером.

visual.DataContext = foo;
Dispatcher.Invoke((Action)()=>{;}); // bamp
// print here

Попробуйте это и посмотрите, поможет ли это.

0 голосов
/ 27 февраля 2013

это XAML делает трюк в некоторых ситуациях

<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
  <... Name="myPrintElement" />
</ScrollViewer >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...