Запуск приложений System.Windows.Application и Forms в потоке пользовательского интерфейсаC#

Место общения программистов C#
Ответить
Anonymous
 Запуск приложений System.Windows.Application и Forms в потоке пользовательского интерфейса

Сообщение Anonymous »

Мне не удалось найти полных примеров объединения WPF и WinForms для приложений на панели задач.
Если я использую System.Windows.Forms.ContextMenuStrip для настройки меню панели задач с кнопками и действиями, мне нужно будет запустить в потоке пользовательского интерфейса System.Windows.Forms.ApplicationContext, и вызов для этого блокируется:

Код: Выделить всё

...
trayComponent.InitializeComponent();
System.Windows.Forms.Application.Run(trayComponent); // Blocks calling thread
Но в моем приложении также есть окна WPF, которые может открыть пользователь, и я обнаружил, что создание объектов Window без запуска System.Windows.App работает, а ввод текста — нет, если не установлен ElementHost.EnableModelessKeyboardIterop:

Код: Выделить всё

await UIDispatcher.BeginInvoke(() => {
SettingsWindow settingsWindow = new SettingsWindow();
ElementHost.EnableModelessKeyboardInterop(settingsWindow);
settingsWindow.Show(); // no app.Run anywhere
});
Теперь следующая проблема, которую я хотел решить, заключалась в том, чтобы заставить App.xaml работать, поскольку определенные там ресурсы, по-видимому, были недоступны для XAML, созданного Windows таким образом, и кажется, что простой запуск приложения в асинхронном вызове работает; точкой входа приложения становится:

Код: Выделить всё

// Start WPF app event loop
_ = Task.Run(async () => {
await UIDispatcher!.BeginInvoke(() => {
TestTrayWithWPF.App app = new TestTrayWithWPF.App();
app.InitializeComponent();
app.Run(); // blocking
});
});

// Start WinForms tray component
trayComponent.InitializeComponent();
System.Windows.Forms.Application.Run(trayComponent); // also blocking, but everything works fine?
Теперь меня беспокоит, можно ли сделать 2 блокирующих вызова потока пользовательского интерфейса, а также тот факт, что будет вызов BeginInvoke, которого никогда не существует.
Вот полный пример: https://github.com/YetAnotherGeorge/TrayWithWPF>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -ui-thread
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»