WPF: Как я могу программно закрыть PrintDialog? - PullRequest
0 голосов
/ 18 февраля 2010

Как я могу программно закрыть 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 голосов
/ 19 февраля 2010

Внутри класса PrintDialog используется Win32PrintDialog в качестве локальной переменной для метода ShowDialog(), который, в свою очередь, в конечном итоге использует общий диалог Windows. Использование отражения для того, чтобы что-то закрыть, может быть бесполезным или, по крайней мере, сводящим с ума.

Просто натяжка, как я ее не использовал, но может быть возможно использовать Белый , чтобы выдать нажатие кнопки на кнопку отмены диалога. UISpy (упомянутый на Белой странице) тоже может пригодиться для этого.

...