WPF(.NET4.5)如何调出含纸张方向设置的打印设置对话框
问题场景
基于.NET Framework 4.5开发WPF应用时,需要调出包含纸张选择、打印方向设置项的打印设置对话框,优先采用WPF平台方案,尽量不依赖Windows Forms实现。
当前调用打印对话框的代码如下:
PrintDialog myPrintDialog = new PrintDialog(); myPrintDialog.ShowDialog();
这段代码弹出的默认WPF打印对话框只提供打印范围、打印份数设置选项,没有需要的纸张选择、打印方向配置功能,目标对话框效果如下:
解决方案
别在WPF封装的默认PrintDialog里找对应入口了,这个控件本身就是做了裁剪的简化版本,界面上根本没开放纸张、方向的可视化选择入口,这部分配置默认只开放了代码操作入口,要通过修改PrintDialog.PrintTicket属性才能设置,没法直接让用户在弹窗里交互选择。
优先方案:无WinForm依赖的原生API调用
如果不想引入Windows Forms相关依赖,可以直接P/Invoke调用系统comdlg32.dll里的PrintDlgEx接口,直接调出系统自带的完整版本打印通用对话框,就是你截图里的样式。这个接口是Windows系统原生提供的,和WPF打印流程完全兼容,拿到用户选择的配置后,直接映射赋值给WPF的PrintTicket、PrintQueue对象就能走后续WPF打印逻辑,不需要额外适配。
快速实现方案
如果项目允许引入System.Windows.Forms程序集,实现成本最低,直接实例化WinForm版本的PrintDialog就能调出目标窗口,核心代码如下:
// 需要先在项目中添加对System.Windows.Forms、System.Drawing的程序集引用 var winFormPrintDlg = new System.Windows.Forms.PrintDialog { AllowSomePages = true, ShowHelp = false }; // 弹出对话框,传入适配后的WPF窗口句柄保证对话框置顶 var dialogResult = winFormPrintDlg.ShowDialog(new WpfWin32Window(Application.Current.MainWindow)); if (dialogResult == System.Windows.Forms.DialogResult.OK) { // 把对话框返回的打印机、纸张、方向等配置映射到WPF打印对象,执行后续打印即可 }
配套的WPF窗口句柄适配类实现很简单,只要实现WinForm的IWin32Window接口即可:
public class WpfWin32Window : System.Windows.Forms.IWin32Window { private readonly IntPtr _handle; public WpfWin32Window(System.Windows.Window wpfWindow) { _handle = new System.Windows.Interop.WindowInteropHelper(wpfWindow).Handle; } public IntPtr Handle => _handle; }
内容的提问来源于stack exchange,提问作者frankborty
相关产品推荐
相关产品推荐

