gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:02:16 24 4
gpt4 key购买 nike

我正在使用 MahApps.Metro在我的 WPF 项目中,我正在构建一个类来帮助我展示 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]
}

感谢任何帮助。谢谢!

@编辑

貌似问题好像解决了,感谢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()。否则调用将立即返回。

关于c# - 在显示另一个之前隐藏所有可见的 Metro 对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37789431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com