2017-01-23 3 views
0

In meiner WPF einschließlich Caliburn.Micro Anwendung möchte ich dem Benutzer ein neues Fenster anzeigen. Dies funktioniert für alle Fenster, aber für eins. Es wird eine Ausnahme ausgelöst, die besagt:Caliburn Micro Window Manager, 'der aufrufende Thread kann nicht auf dieses Objekt zugreifen, weil ein anderer Thread es besitzt'

Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da ein anderer Thread es besitzt.

das ist, wie ich den Window-Manager von new WindowManager().ShowWindow(...);

WindowManager.ShowWindow(new DatabaseCredentialsViewModel(EventAggregator, WindowManager, 
        SettingsManager)); 

Außerdem habe ich auch versucht, zu 'erstellen Sie einen neuen Window Manager' nennen. Nichts davon funktioniert jedoch. Was unterscheidet sich von den anderen Fenstern?

Ich habe einen neuen Thread für die Arbeit im Hintergrund in OnViewLoaded gestartet, von dem ich ein neues Fenster anzeigen möchte. Der Grund, warum ich an erster Stelle einen neuen Thread gestartet habe, ist, dass der GUI-Thread standardmäßig der Hauptthread ist. Wenn ich also keinen neuen Thread starte, wird die GUI nicht richtig geladen, bis der Code ausgeführt wird (und so weiter).

Edit I: Ich habe das Problem untersucht und herausgefunden, dass es nicht der Window Manager ist, der an dieser Stelle den Ärger verursacht, aber vielleicht , da ich einen komplett neuen Window Manager (eine neue Instanz der ursprünglichen Klasse) erstellt habe es würde immer noch den gleichen Fehler werfen.

Edit II: Ich habe das versucht. Der genaue Fehler bleibt jedoch bestehen.

Dispatcher.CurrentDispatcher.BeginInvoke((Action) (() => 
      { 
       WindowManager.ShowWindow(new DatabaseCredentialsViewModel(EventAggregator, WindowManager, SettingsManager)); 
      })); 
+0

Haben Sie versucht, 'Application.Current.Dispatcher' anstelle von' Dispatcher.CurrentDispatcher' zu verwenden? – Doom5

+0

Ich habe genau das neulich gemacht und jetzt funktioniert es (obwohl ich deine Antwort zu der Zeit noch nicht gesehen habe). Aber es war richtig. Mein Code funktioniert gut, wenn ich in Application.Current.Dispatcher ändere. –

Antwort

0

WPF-Anwendungen sind Single-Thread-Anwendungen, Sie können GUI-Elemente aus einem anderen Thread nicht direkt ändern. Sie können dazu verwenden (google Dispatcher.BeginInvoke, oder siehe example), oder BackgroundWorker, oder vorzugsweise async/await (siehe this).

+0

Seltsamerweise habe ich keinen Dispatcher im Datenkontext verfügbar. –

+0

@ Çan Sie können 'Application.Current.Dispatcher' verwenden – Doom5

+0

Ich kann immer noch nicht herausfinden, wie dies mit Caliburn.Micro funktionieren soll –

Verwandte Themen