Ausführen von System.Windows.Application und Forms Application im UI-ThreadC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Ausführen von System.Windows.Application und Forms Application im UI-Thread

Post by Anonymous »

Ich konnte keine vollständigen Beispiele für die Kombination von WPF und WinForms für Taskleistenanwendungen finden.
Wenn ich System.Windows.Forms.ContextMenuStrip verwende, um ein Taskleistenmenü mit Schaltflächen und Aktionen zu konfigurieren, muss ich im UI-Thread einen System.Windows.Forms.ApplicationContext ausführen, und der Aufruf dazu blockiert:

Code: Select all

...
trayComponent.InitializeComponent();
System.Windows.Forms.Application.Run(trayComponent); // Blocks calling thread
Aber meine Anwendung verfügt auch über WPF-Fenster, die der Benutzer öffnen kann, und ich habe festgestellt, dass das Erstellen von Fensterobjekten funktioniert, ohne dass System.Windows.App ausgeführt wird, die Texteingabe jedoch nicht, es sei denn, ElementHost.EnableModelessKeyboardIterop ist festgelegt:

Code: Select all

await UIDispatcher.BeginInvoke(() => {
SettingsWindow settingsWindow = new SettingsWindow();
ElementHost.EnableModelessKeyboardInterop(settingsWindow);
settingsWindow.Show(); // no app.Run anywhere
});
Das nächste Problem, das ich nun lösen wollte, bestand darin, App.xaml zum Laufen zu bringen, da die dort definierten Ressourcen für XAML, das Windows auf diese Weise erstellt hat, nicht verfügbar zu sein schienen, und es scheint, dass die einfache Ausführung der App in einem asynchronen Aufruf funktioniert. Der Einstiegspunkt der Anwendung wird:

Code: Select all

// 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?
Was mir jetzt Sorgen macht, ist, ob es in Ordnung ist, zwei blockierende Aufrufe an den UI-Thread zu tätigen, und die Tatsache, dass es einen BeginInvoke-Aufruf geben wird, der nie existiert.
Hier ist ein vollständiges Beispiel: https://github.com/YetAnotherGeorge/TrayWithWPF

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post