我在用着MahApps.Metro http://mahapps.com在我的 WPF 项目中,我正在构建一个类来帮助我展示Dialogs http://mahapps.com/controls/dialogs.html. 我想知道是否有一种方法可以在显示另一个对话框之前关闭所有可见的对话框。
有时,当我展示一个ProgressDialog
然后一个MessageDialog
ProgressDialog 未正确关闭,并且停留在后台,因此当我关闭 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();