C# 在WPF中打印隐藏窗口
我想创建一个窗口对象,设置一些值,然后直接发送到打印机而不显示它。我认为这是正确的做法,但显示了一个空白的文件C# 在WPF中打印隐藏窗口,c#,wpf,xaml,printing,C#,Wpf,Xaml,Printing,我想创建一个窗口对象,设置一些值,然后直接发送到打印机而不显示它。我认为这是正确的做法,但显示了一个空白的文件 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(
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(),它工作正常 无需创建隐藏窗口,您可以使用。要打印
DocumentPage
s,您需要扩展该类
下面是实现一个简单的DocumentPaginator
的代码,它将打印出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; }
}
}
不打印窗口,而是打印该窗口主网格的内容
<Grid x:Name="maingrid">
<!-- All content here -->
</Grid>
如果不进行渲染,我怀疑会生成视觉效果。如果不调用Show(),就无法使其进行渲染?这是一个疯狂的想法,如果在屏幕外的某个位置显示窗口,而不在任务栏中显示窗口,也不激活窗口,会怎么样?可能会起作用;)我当前正在调用Show(),让它自己打印,然后调用close。哎哟。如果它的可见性崩溃了怎么办?我很确定我也尝试过这个选项,但是谢谢!
<Grid x:Name="maingrid">
<!-- All content here -->
</Grid>
MyWindow myWindow = new MyWindow();
PrintDialog printDialog = new PrintDialog();
printDialog.PrintVisual(myWindow.maingrid, string.Empty);
myWindow.Close();