我已经使用自定义DocumentViewer在我的应用程序中实现了打印预览功能(如下所示)。在显示预览之前,我调用PrintDialog.ShowDialog(),以便根据纸张的方向正确创建文档。
但是,DocumentViewer打印按钮调用PrintDialog.ShowDialog(),提示用户再次选择打印机和选项(他们在预览窗口打开之前已经选择了)。
是否有一种方法可以让DocumentViewer打印按钮直接打印而不调用PrintDialog.ShowDialog()
下面是我的方法调用:
ReportViewModel.cs
public void PrintButtonClick(DataGrid dataGrid)
{
PrintDialog printDialog = new PrintDialog();
if (printDialog.ShowDialog() == false)
return;
// Get page size based on print dialog printable area (orientation)
Size pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
// create new paginator for datagrid
DataGridDocumentPaginator paginator = new DataGridDocumentPaginator(dataGrid as DataGrid, "Employer Match Report", pageSize, new Thickness(30, 20, 30, 20));
...
}我是这样做的,这样我就可以正确地生成带有肖像或景观大小值的分页器。否则,DocumentViewer中的预览文档可能无法根据所选择的方向正确显示。
PrintDocumentViewer : DocumentViewer
protected override void OnPrintCommand()
{
PrintDialog printDialog = new PrintDialog();
printDialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket;
printDialog.PrintTicket.PageOrientation = PageOrientation;
// Code assumes this.Document will either by a FixedDocument or a FixedDocumentSequence
FixedDocument fixedDocument = this.Document as FixedDocument;
FixedDocumentSequence fixedDocumentSequence = this.Document as FixedDocumentSequence;
if (fixedDocument != null)
fixedDocument.PrintTicket = printDialog.PrintTicket;
if (fixedDocumentSequence != null)
fixedDocumentSequence.PrintTicket = printDialog.PrintTicket;
XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue);
if (fixedDocument != null)
writer.WriteAsync(fixedDocument, printDialog.PrintTicket);
if (fixedDocumentSequence != null)
writer.WriteAsync(fixedDocumentSequence, printDialog.PrintTicket);
// Create Preview Window and show preview
string s = _previewWindowXaml;
using (var reader = new System.Xml.XmlTextReader(new StringReader(s)))
{
Window preview = System.Windows.Markup.XamlReader.Load(reader) as Window;
DocumentViewer _docViewer = LogicalTreeHelper.FindLogicalNode(preview, "PrintDocumentViewer") as DocumentViewer;
_docViewer.Document = (fixedDocument != null) ? fixedDocument as IDocumentPaginatorSource : fixedDocumentSequence as IDocumentPaginatorSource;
// hide the search bar in the PrintPreview dialog
ContentControl cc = _docViewer.Template.FindName("PART_FindToolBarHost", _docViewer) as ContentControl;
cc.Visibility = Visibility.Collapsed;
preview.ShowDialog();
}
}发布于 2018-01-18 07:30:15
您可以填充打印机和纸张大小属性,然后不显示对话框。
var pd = new PrintDialog();
pd.PrintTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.NorthAmericaLetter, 816.0, 1056.0);
pd.PrintQueue = new LocalPrintServer().GetPrintQueue("Microsoft Print to PDF");要重写Print命令,请执行以下操作:
<DocumentViewer>
<DocumentViewer.CommandBindings>
<CommandBinding Command="ApplicationCommands.Print" Executed="Print_Executed" />
</DocumentViewer.CommandBindings>
</DocumentViewer>发布于 2016-10-12 12:30:17
打印按钮很难被覆盖,但我找到了一种方法。即使它可能被认为是一种肮脏的黑客行为,最终重要的还是结果。
我只是用一个不可见的按钮覆盖了打印按钮(反正这是第一个按钮),该按钮将单击重定向到我自己的打印函数。在本示例代码中,搜索工具栏也被隐藏,Ctrl+P被禁用:
<Grid>
<DocumentViewer x:Name="DocumentViewer">
<DocumentViewer.Resources>
<Style TargetType="ContentControl">
<Style.Triggers>
<Trigger Property="Name" Value="PART_FindToolBarHost">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</DocumentViewer.Resources>
<DocumentViewer.InputBindings>
<KeyBinding Key="P" Modifiers="Control" Command="ApplicationCommands.NotACommand" />
</DocumentViewer.InputBindings>
</DocumentViewer>
<Button Width="32" Height="32" VerticalAlignment="Top" HorizontalAlignment="Left" Opacity="0.01" Click="OnPrint" ></Button>
</Grid>发布于 2015-05-13 19:13:28
我希望您到目前为止已经解决了这个问题,但是您可以将这个问题作为修改DocumentViewer控件模板的基础:
How do you hide a WPF DocumentViewer's menu bars?
有一个指向MSDN文章的链接,它应该向您展示如何修改模板,以便“打印”按钮可以执行您想要的操作,而不是默认的打印操作。
https://stackoverflow.com/questions/25409831
复制相似问题