GUI Блокировка при использовании PrintDialog и PrintPreviewDialog в .net - PullRequest
5 голосов
/ 05 декабря 2008

Я использую .net PrintPreviewDialog, и всякий раз, когда он генерирует предварительный просмотр, он блокирует мой графический интерфейс в фоновом режиме и делает его похожим на сбой до завершения предварительного просмотра. Видя, что всплывающее окно с прогрессом страницы .net не является диалогом, можно выбрать фон, который затем выходит вперед, наполовину нарисованный, заблокированный. Это также происходит, когда пользователь нажимает фактическую кнопку «Печать» в диалоговом окне предварительного просмотра, и когда я просто запускаю PrintDocument.Print (). Есть ли простой способ изменить следующий код, чтобы остановить зависание графического интерфейса, когда пользователь ожидает .net рисовать страницы печати:

//just showing a preview, hangs up background GUI on generating the preview
// and when user prints straight from the preview
this.printPreviewDialog.ShowDialog(this);

//just trying to print a .net PrintDocument class, GUI hangs in background
// when .net is drawing the pages
this.printDocument.Print();

Ответы [ 4 ]

3 голосов
/ 17 декабря 2008

Другим вариантом будет создание нового потока пользовательского интерфейса:

ThreadStart ts = () =>
{
    printDocument.Print();

    // Start the message loop to prevent the thread from finishing straight away.
    System.Windows.Forms.Application.Run();
};
Thread t = new Thread(ts);
t.SetApartmentState(ApartmentState.STA);
t.Start();

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

1 голос
/ 11 декабря 2008

метод ShowDialog создает модальное окно, оно блокирует основной поток. метод Show создает немодальное окно, он не блокирует основной поток.

Когда вы звоните

this.printDocument.Print ();

снова выполняет свою работу в главном потоке.

Чтобы сделать это в фоновом потоке, вы можете попробовать что-то вроде (с макушкой)

ThreadPool.QueueUserWorkItem ((obj) => this.printDocument.Print ());

он использует новый поток для печати документа вместо основного потока GUI.

Если вы хотите узнать больше, вы должны исследовать потоки

1 голос
/ 05 декабря 2008

Вы, вероятно, должны вызывать эти методы в другом потоке, если они занимают так много времени. Изучите использование BackgroundWorker , чтобы помочь вам.

Кроме того, возможно, это из-за принтеров Windows, а не вашего кода (используете ли вы сетевой принтер? Если да, перейдите на виртуальный принтер и посмотрите, изменит ли это что-либо).

0 голосов
/ 24 декабря 2008

Dot Net Rocks TV (dnrtv) рассказывает о том, как запускать вещи в фоновом потоке, чтобы освободить поток GUI в эпизоде ​​16 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...