WPF中如何打印隐藏窗口

5

我有一个Window对象,想要创建并设置一些值,并将其直接发送到打印机而不显示它。我认为下面的代码是正确的方式,但只显示空白文档。

PrintDialog dlg = new PrintDialog();

ReportWindow rw = new ReportWindow(); //WPF Window object

var sz = new Size(96*8.5, 96*11);     //size of a paper page, 8.5x11

rw.Measure(sz); rw.Arrange(new Rect(sz)); 

//   rw.Show();  //want to keep it hidden

dlg.PrintVisual(rw, "report printout");

rw.Close(); 

为了验证打印代码是否正常,我将其放在表单加载事件中并调用Show()函数,这样可以很好地运行。

如果没有被呈现,我怀疑将无法生成可视化。 - user7116
没有办法在不调用Show()的情况下使其渲染。 - Brady Moritz
3
一个疯狂的想法,如果你把窗口显示在屏幕外面,既不在任务栏中显示它,也不使其激活? - Andrei Pana
可能管用 ;) 我目前正在调用Show(),让它打印自己并关闭自己。呃。 - Brady Moritz
如果它的Visibility.Collapsed是什么情况? - iLemming
@AndreiPana - 我希望那是一个问题的答案,这样我就可以因为你帮助解决我的问题而给你声望了 :) - unrelativity
2个回答

3
不需要创建隐藏的窗口,您可以使用 DocumentPage通过渲染WPF控件进行打印。要打印DocumentPage,您需要扩展 DocumentPaginator类。
下面是实现简单的DocumentPaginator代码,它将打印任何List中的UIElements
class DocumentPaginatorImpl : DocumentPaginator
{
    private List<UIElement> Pages { get; set; }

    public DocumentPaginatorImpl(List<UIElement> pages)
    {
        Pages = pages;
    }

    public override DocumentPage GetPage(int pageNumber)
    {
        return new DocumentPage(Pages[pageNumber]);
    }

    public override bool IsPageCountValid
    {
        get { return true; }
    }

    public override int PageCount
    {
        get { return Pages.Count; }
    }

    public override System.Windows.Size PageSize
    {
        get
        {
            /* Assume the first page is the size of all the pages, for simplicity. */
            if (Pages.Count > 0)
            {
                UIElement page = Pages[0];

                if (page is Canvas)
                    return new Size(((Canvas)page).Width, ((Canvas)page).Height);
                // else if ...
            }

            return Size.Empty;
        }
        set
        {
            /* Ignore the PageSize suggestion. */
        }
    }

    public override IDocumentPaginatorSource Source
    {
        get { return null; }
    }
}

最后,要进行打印,您只需要执行以下操作:
dialog.PrintDocument(new DocumentPaginatorImpl(pages), "Print Job Description");

0

不要打印窗口,而是打印该窗口主网格的内容。

<Grid x:Name="maingrid">
    <!-- All content here -->
</Grid>

然后在你的代码中

MyWindow myWindow = new MyWindow();
PrintDialog printDialog = new PrintDialog();
printDialog.PrintVisual(myWindow.maingrid, string.Empty);
myWindow.Close();

我很确定我也尝试过这个选项,但还是谢谢! - Brady Moritz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接