2016-06-13 7 views
3

私はWPFプロジェクトでMahApps.Metroを使用しています。私はDialogsの表示に役立つクラスを作成しています。 私は、別のものを表示する前にすべての表示されるダイアログを閉じる方法があるかどうかを知りたいと思います。可視メトロダイアログを別のものを表示する前に非表示

時々

、私はProgressDialog、その後、ProgressDialogが正しく閉じられ、背景にとどまりされていないMessageDialogを示したので、私はMessageDialogを閉じたときに、それがUIを凍結したままになります。ここで

GIF to ilustrate

は、私は現在、すべてのダイアログを非表示にしようとしている方法は次のとおりです。

public static async void HideVisibleDialogs(MetroWindow parent) 
{ 
    BaseMetroDialog dialogBeingShow = await parent.GetCurrentDialogAsync<BaseMetroDialog>(); 

    while (dialogBeingShow != null) 
    { 
     await parent.HideMetroDialogAsync(dialogBeingShow); 
     dialogBeingShow = await parent.GetCurrentDialogAsync<BaseMetroDialog>(); 
    } 
} 

私はこのようにそれを呼び出す:

public static MessageDialogResult ShowMessage(String title, String message, MetroWindow parent, Int32 timeout, MessageDialogStyle style, MetroDialogSettings settings, MessageDialogResult defaultResult) 
{ 
    AutoResetEvent arEvent = new AutoResetEvent(false); 

    App.Current.Dispatcher.Invoke(() => 
    { 
     HideVisibleDialogs(parent); 
     arEvent.Set(); 
    }); 

    arEvent.WaitOne(); 

    [Rest of method] 
} 

すべてのヘルプは高く評価されています。ありがとうございました!

public static Task HideVisibleDialogs(MetroWindow parent) 
{ 
    return Task.Run(async() => 
    { 
     await parent.Dispatcher.Invoke(async() => 
     { 
      BaseMetroDialog dialogBeingShow = await parent.GetCurrentDialogAsync<BaseMetroDialog>(); 

      while (dialogBeingShow != null) 
      { 
       await parent.HideMetroDialogAsync(dialogBeingShow); 
       dialogBeingShow = await parent.GetCurrentDialogAsync<BaseMetroDialog>(); 
      } 
     }); 
    });  
} 

そして、私はこのようにそれを呼び出す:

@EDIT

はどうやら、問題がThomas Freudenberg

のおかげでこれが今どのように解決しているように見えます

HideVisibleDialogs(parent).Wait(); 

答えて

3

HideVisibleDialogsは非同期メソッドです。戻り値の型をTaskに変更して、それを待つ、つまりHideVisibleDialogs(parent).Wait()を待ちます。それ以外の場合、コールはすぐに戻ります。

+0

HideVisibleDialogsはUIと同じスレッドで実行する必要があります(そうでないと、別のスレッドがオブジェクトを所有しているため、呼び出し元スレッドがオブジェクトにアクセスできないという例外がスローされます)。特定のスレッドでタスクを実行する方法はありますか?私の方法は今のようになります:http://pastebin.com/raw/rxKE2frU(私はこの方法で解決すれば質問を編集します)。あなたの時間をありがとう! –

+1

ディスパッチャーを介して 'HideVisibleDialogs'を呼び出すと、' parent.Dispatcher.Invoke(new Func (()=> HideVisibleDialogs(親))) ''(私は再プロンプトを持っていないので、 –

関連する問題