WPF / Silverlight: печать визуальных элементов — недостатки

#wpf #silverlight #printing

#wpf #silverlight #печать

Вопрос:

Я читал один или два раза, что печать визуальных элементов из WPF / Silverlight имеет некоторые недостатки, поэтому люди обычно склонны использовать FlowDocument или FixedDocument для печати.

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

Есть ли еще недостатки, которые я должен учитывать, прежде чем выбрать этот способ печати?

Ответ №1:

Вы можете печатать визуальные объекты, разместив их в FrameworkElement, а затем добавив FrameworkElement в FixedDocument в качестве содержимого FixedPage. Визуальный хост выглядит следующим образом:

 /// <summary>
/// Implements a FrameworkElement host for a Visual
/// </summary>
public class VisualHost : FrameworkElement
{
    Visual _visual;


    /// <summary>
    /// Gets the number of visual children (always 1)
    /// </summary>
    protected override int VisualChildrenCount
    {
        get { return 1; }
    }


    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="visual">The visual to host</param>
    public VisualHost(Visual visual)
    {
        _visual = visual;

        AddVisualChild(_visual);
        AddLogicalChild(_visual);
    }


    /// <summary>
    /// Get the specified visual child (always
    /// </summary>
    /// <param name="index">Index of visual (should always be 0)</param>
    /// <returns>The visual</returns>
    protected override Visual GetVisualChild(int index)
    {
        if (index != 0)
            throw new ArgumentOutOfRangeException("index out of range");
        return _visual;
    }
}
  

Затем вы можете добавить их и распечатать следующим образом:

         // Start the fixed document
        FixedDocument fixedDoc = new FixedDocument();
        Point margin = new Point(96/2, 96/2);      // Half inch margins

        // Add the visuals
        foreach (Visual nextVisual in visualCollection)
        {
            // Host the visual
            VisualHost host = new VisualHost(nextVisual);
            Canvas canvas = new Canvas();
            Canvas.SetLeft(host, margin.X);
            Canvas.SetTop(host, margin.Y);
            canvas.Children.Add(host);

            // Make a FixedPage out of the canvas and add it to the document
            PageContent pageContent = new PageContent();
            FixedPage fixedPage = new FixedPage();
            fixedPage.Children.Add(canvas);
            ((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage);
            fixedDoc.Pages.Add(pageContent);
        }

        // Write the finished FixedDocument to the print queue
        XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(queue);
        xpsDocumentWriter.Write(fixedDoc);
  

Комментарии:

1. Спасибо за фрагмент. Но мой вопрос на самом деле больше касается реального опыта работы с этим видом печати. Какие проблемы возникнут, придется ли мне биться головой о стену чаще, чем обычно и так далее.

2. Недостатков, с которыми я столкнулся, нет. Я использовал описанный выше метод для печати страниц, заполненных объектами WPF, а также использовал его для печати невероятно сложных рисунков с тысячами линий и заполненных областей с помощью DrawingVisual.