WPF:我如何以编程方式关闭PrintDialog?

时间:2010-02-18 17:33:21

标签: wpf winapi printing printdialog

如何以编程方式关闭WPF PrintDialog?我试图通过反射来调用它Finalize,而这也不会关闭它。这是我尝试过的:

using System;
using System.Reflection;
using System.Threading;
using System.Windows;
using System.Windows.Controls;

namespace WpfApplication15
{
    partial class Window1 : Window
    {
        PrintDialog _printDialog;

        public Window1()
        {
            InitializeComponent();
            new Thread(OpenDialog).Start();
            new Thread(CloseDialog).Start();
        }

        void OpenDialog()
        {
            Thread.Sleep(1000);
            Dispatcher.BeginInvoke((Action)OpenDialogImpl);
        }

        void OpenDialogImpl()
        {
            _printDialog = new PrintDialog();
            _printDialog.ShowDialog();
        }

        void CloseDialog()
        {
            Thread.Sleep(2000);
            Dispatcher.BeginInvoke((Action)CloseDialogImpl);
        }

        void CloseDialogImpl()
        {
            var type = typeof(PrintDialog);
            var flags = BindingFlags.Instance | BindingFlags.NonPublic;
            var finalize = type.GetMethod("Finalize", flags);
            finalize.Invoke(_printDialog, null);
            MessageBox.Show("Finalized");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在内部,PrintDialog类使用Win32PrintDialog作为ShowDialog()方法的局部变量,而后者最终使用Windows公共对话框。使用反射来获取某些东西可能是徒劳的,或者至少令人发狂。

只是一段时间,因为我还没有使用它,但是可以使用White按下对话框的“取消”按钮。 UISpy(在白页上提到)也可能很方便。