Документ потока печати WPF

Asked
Viewd6313

6

Приветствую, У меня проблема с печатью в WPF. Я создаю рабочий документ и добавляю в него некоторые элементы управления. Предварительный просмотр работает нормально, и у меня нет проблем с печатью из окна предварительного просмотра. Проблема возникает, когда я печатаю прямо на принтер без предварительного просмотра.Но что более удивительно - когда я использую XPS Document Writer в качестве принтера все в порядке, когда я использую какой-либо физический принтер, некоторые элементы управления в моем потоковом документе не отображаются. Заранее спасибо

  • Ссылка в приведенном выше комментарии больше не работает, но поиски на сайте, на который она перенаправляет, привели меня к статье с подходом DoEvents: http://www.zagstudio.com/blog/493#.UegOCo1dyaI

    Morten Christiansen18 июля 2013, 15:49
  • Приветствую, Я решил проблему. Я обнаружил, что привязка и отправка документа на принтер являются асинхронными операциями.Поэтому я создал эквивалент Appliaction.DoEvents () в WPF на основе статьи БеаСтольница.Это решило проблему

    http://bea.stollnitz.com/blog/index.php?s=doevents

    05 ноября 2009, 07:50

3 ответов

0

Я заметил одну вещь: Совет: элементы управления, которые не отображаются, являются элементами управления, которые я привязываю для некоторых данных, поэтому можно сделать вывод, что привязка не работает.Может быть, привязка не выполняется перед отправкой документа на принтер?

  • Питер, совет по использованию Stackoverflow - если вы хотите добавить информацию, вам следует отредактировать исходный вопрос, а не публиковать «ответы».В общем, если вы хотите ответить на конкретный ответ, используйте комментарий (хм, за исключением того, что вы еще не можете!)

    Murph04 ноября 2009, 14:51
4

Важное примечание: XpsDocumentWriter можно использовать даже при печати напрямую на физический принтер. Не совершайте ошибку, которую я сделал, избегая этого только потому, что вы не создаете файл .xps!

В любом случае - у меня была такая же проблема, и ни один из DoEvents() хаков, похоже, не помог. Я также не был особенно счастлив от того, что им пришлось их использовать. В моей ситуации некоторые элементы управления привязкой к данным печатаются нормально, а некоторые другие (вложенные пользовательские элементы управления) - нет. Это выглядело так, как если бы только один «уровень» был привязан к базе данных, а остальные не связались бы даже при взломе «DoEvents ()».

Решение было простым. Используйте XpsDocumentWriter следующим образом. откроется диалоговое окно, в котором вы можете выбрать любой установленный физический принтер, который вам нужен.

         // 8.5 x 11 paper
        Size sz = new Size(96 * 8.5, 96 * 11);

        // create your visual (this is a WPF UserControl)
        var template = new PackingSlipTemplate()
        {
            DataContext = new PackingSlipViewModel(order)
        };

        // arrange
        template.Measure(sz);
        template.Arrange(new Rect(sz));
        template.UpdateLayout();

        // print to XpsDocumentWriter
        // this will open a dialog and you can print to any installed printer
        // not just a 'virtual' .xps file
        PrintDocumentImageableArea area = null;
        XpsDocumentWriter xps = PrintQueue.CreateXpsDocumentWriter(ref area,);

        xps.Write(template);
 

Я нашел книгу OReilly по « Программирование WPF 'весьма полезно с его главой о Печать - найдено в Google Книгах .


Если вы не хотите, чтобы диалоговое окно печати отображалось, но хотите печатать непосредственно на принтере по умолчанию, вы можете сделать следующее. (Для меня приложение предназначено для печати упаковочных листов на складе - и я не хочу, чтобы диалоговое окно появлялось каждый раз).

         var template = new PackingSlipTemplate()
        {
            DataContext = new PackingSlipViewModel(orders.Single())
        };

        // arrange
        template.Measure(sz);
        template.Arrange(new Rect(sz));
        template.UpdateLayout();

        LocalPrintServer localPrintServer = new LocalPrintServer();
        var defaultPrintQueue = localPrintServer.DefaultPrintQueue;

        XpsDocumentWriter xps = PrintQueue.CreateXpsDocumentWriter(defaultPrintQueue);
        xps.Write(template, defaultPrinter.DefaultPrintTicket);
 
  • Была аналогичная проблема, и это не помогло.

    Morten Christiansen17 июля 2013, 14:08
1

Документ XPS можно распечатать без проблем