2017-01-23 3 views
0

WPFにはCaliburn.Microアプリケーションが含まれていますので、新しいウィンドウを表示します。これはすべてのウィンドウでうまく動作しますが、1つでは問題ありません。他のスレッドが所有しているため、呼び出しスレッドはこのオブジェクトにアクセスできません。

呼び出しスレッドは、別のスレッドがこのオブジェクトを所有しているため、このオブジェクトにアクセスできません。

これは私が他に

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

ウィンドウマネージャを呼び出す方法です、私はまたnew WindowManager().ShowWindow(...);によって「新しいウィンドウマネージャを作成」してみました。しかし、上記の作業のどれも。他のウィンドウとは何が違うのですか?

新しいウィンドウを表示するには、OnViewLoadedのバックグラウンドで新しいスレッドを開始しました。最初に新しいスレッドを開始した理由は、デフォルトでGUIスレッドがメインスレッドであるため、新しいスレッドを開始しないと、コードが実行されるまでGUIが適切にロードされないということです等々)。

編集I:私はこの問題を調査して、この時点で問題を引き起こしているウィンドウマネージャではないが、おそらくnew DatabaseCredentialsViewModelという、完全に新しいウィンドウマネージャ(元のクラスの新しいインスタンス)を作成し、それでも同じエラーが発生します。

編集II:これを試しました。ただし、正確なエラーは引き続き発生します。

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

'Dispatcher.CurrentDispatcher'の代わりに' Application.Current.Dispatcher'を使ってみましたか? – Doom5

+0

先日私はまさにこれをやったが、今は(その時あなたの答えを見ていないにもかかわらず)働いている。しかしそれは正しかった。私のコードは、Application.Current.Dispatcherに変更すると素晴らしい動作をします。 –

答えて

0

WPFアプリケーションはシングルスレッドアプリケーションであり、別のスレッドからGUI要素を直接変更することはできません。これには(google Dispatcher.BeginInvoke、またはexampleを参照)、BackgroundWorker、またはasync/awaitthisを参照)を使用できます。

+0

奇妙なことに、私はデータコンテキストでディスパッチャを利用できません。 –

+0

@Çan 'Application.Current.Dispatcher'を使用することができます – Doom5

+0

これはCaliburn.Microでどのように動作するはずです –

関連する問題

 関連する問題