2017-09-01 21 views
1

私はほぼ1年間、UnityとMVVMパターンを使用してWPF/Prismでほぼ独占的に作業してきました。私はシェル、いくつかのモジュール、スコープリージョンマネージャとシェルホスト共通ポップアップのようなクールなものをたくさん確立するのにかなり成功しました。WPF MVVM/Prism(6.2)/ Unity - PopupWindowActionスレッド間でオーナーを失う

私は今日私の頭を掻き分けています。Cannot set Owner property to a Window that has been closed.定期的にアセンブリの更新を確認し、アプリケーションを再起動してシェルのViewModelで処理するように要求します。私はbootstrapper.Run()でそれをやっていて、bootstrapperはすべてのウィンドウを殺す方法です。ブーム、window that has been closed.

エラーは意味がありますが、私は問題を解決できないようです。 Prism 6.2では、これは(そしておそらくより/以下)を導入した:

if (AssociatedObject != null) 
      wrapperWindow.Owner = Window.GetWindow(AssociatedObject); 

は、スタックトレースによると、これはPopupWindowActionが、それはOwnerだと思っているためしかし、今クローズWindow(、それが失敗している原因となっているものですこれは新しい機能であり、テストされていないことに気付く価値がある< 6.2)。私はそれを再インスタンス化する方法を見つけることができないか、 Owner(またはそれらの行に沿った何か) - さらにはになるはずです。

私はこのPopupWindowActionInteractionRequestTriggerで発射しており、そのすべてがカスタムUserControlを開くだけです。また、このすべては、別のスレッドで起こるので、私は(基本的にINotificationを発射する)私のスコープInteractionServiceを見つけるために戻って、主Dispatcherに行かなければならない:

Application.Current.Dispatcher.Invoke(() => 
{ 
    var dialogResponse = InteractionService.ShowDialog(... 
//... 

私の質問はです:ポップアップができませんそれが閉じられているか、別のスレッドになっているので、親だと分かりますか?それを超えて、これは合理的な話ですか、それとも私のユーザーの要求に対してより良い解決策ですか?

答えて

0

これは間違いなく所有者ウィンドウが閉じられているためです。ディスパッチャがクロススレッドの問題を解決したと言いましたか?

私は完全にそれを得るかどうかわかりません... あなたのシェルを開いたままにしておけば、あなたのシェルビューにInteractionRequestTriggerを追加し、あなたのモジュールからそれを上げるコンポジットコマンドを作成することをお勧めします

関連する問題