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

2024-05-07

我在用着MahApps.Metro http://mahapps.com在我的 WPF 项目中,我正在构建一个类来帮助我展示Dialogs http://mahapps.com/controls/dialogs.html. 我想知道是否有一种方法可以在显示另一个对话框之前关闭所有可见的对话框。

有时,当我展示一个ProgressDialog然后一个MessageDialogProgressDialog 未正确关闭,并且停留在后台,因此当我关闭 MessageDialog 时,它会停留在那里冻结 UI。

以下是我目前尝试隐藏所有对话框的方法:

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

显然,问题似乎已经解决,感谢托马斯·弗罗伊登伯格 https://stackoverflow.com/users/4747/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();

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐