我在我的WPF项目中使用MahApps.Metro,我正在构建一个类来帮助我显示Dialogs。 我想知道是否有办法在显示另一个对话框之前关闭所有可见的对话框。
有时候,当我显示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
显然,由于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();
答案 0 :(得分:3)
HideVisibleDialogs
是一种异步方法。我会尝试将其返回类型更改为Task
并等待它,即HideVisibleDialogs(parent).Wait()
。否则呼叫会立即返回。