Открытие окна WPF в другом потоке из приложения Windows Forms - PullRequest
8 голосов
/ 08 апреля 2009

Хорошо, я должен начать с того, что я не уверен, что это правильный способ борьбы с этим, но ...

По сути, я создал окно в WPF для отображения уведомлений в моем приложении (немного похоже на уведомление о новой почте Outlook). Я хотел бы попытаться показать это окно в своем собственном потоке (в будущем это может сделать какую-то работу).

Я создал окно с использованием WPF, потому что он немного приятнее в обработке таких вещей, как AlwaysOnTop и Fading In and Out.

Приложение, которое показывает уведомление, является приложением 3.5 Windows Forms. Я видел примеры, подобные этой SOF: C # winforms запуска формы (Splash), не скрывающей для отображения формы в другом потоке, однако я не могу запустить новый цикл сообщений с окном WPF.

Я пытался просто вызвать Notification.Show () в новом потоке, однако окно никогда не отображается.

  1. Можно ли показать этот WPF в его собственном потоке?

  2. Почему я вижу, что некоторые ресурсы говорят, что вы не должны показывать какой-либо пользовательский интерфейс в отдельном потоке?

Ответы [ 3 ]

15 голосов
/ 08 апреля 2009

Модель с резьбой *1001* имеет подробности об этом. Ищите «Несколько окон, несколько потоков».

По сути, вы запускаете новый поток, который создает соответствующее окно и затем вызывает

System.Windows.Threading.Dispatcher.Run();

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

3 голосов
/ 08 апреля 2009
  1. Можно ли показать этот WPF в его собственном потоке?

Абсолютно. Просто создайте новый поток STA и создайте и отобразите ваш Window из него. Я использовал эту технику для заставки, потому что основной поток (UI) действительно был связан с другими вещами. Это было полностью вне моего контроля, сколько работы было сделано в потоке пользовательского интерфейса из-за сторонней среды, которую мы использовали.

  1. Почему некоторые ресурсы говорят, что вам не следует показывать какой-либо пользовательский интерфейс в отдельном потоке?

Возможно, из-за дополнительной сложности. Если один из ваших Window хочет передать данные другому, вы должны помнить, что они выполняются в отдельных потоках. Поэтому каждый должен использовать свой Dispatcher для маршалинга вызовов в нужном потоке.

0 голосов
/ 08 апреля 2009

Вы должны отобразить уведомление, используя основной поток пользовательского интерфейса, и если это окно выполнит какую-либо работу, запустите эту работу в фоновом потоке. Вы не должны использовать более одного потока для доступа или создания объектов пользовательского интерфейса, даже если вы не разделяете эти объекты между потоками.

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