You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:42:15