在显示另一个对话框之前隐藏所有可见的Metro对话框

时间:2016-06-13 12:06:14

标签: c# wpf dialog mahapps.metro

我在我的WPF项目中使用MahApps.Metro,我正在构建一个类来帮助我显示Dialogs我想知道是否有办法在显示另一个对话框之前关闭所有可见的对话框。

有时候,当我显示ProgressDialog然后MessageDialog时,ProgressDialog没有正确关闭,并且保持在后台,所以当我关闭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]
}

感谢任何帮助。谢谢!

@EDIT

显然,由于Thomas Freudenberg

,这个问题似乎已经解决了

现在就是这样:

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>();
            }
        });
    });      
}

我称之为:

HideVisibleDialogs(parent).Wait();

1 个答案:

答案 0 :(得分:3)

HideVisibleDialogs是一种异步方法。我会尝试将其返回类型更改为Task并等待它,即HideVisibleDialogs(parent).Wait()。否则呼叫会立即返回。