diff --git a/src/Files.App/App.xaml.cs b/src/Files.App/App.xaml.cs index a7b67a98829f..4cc7caeab3e7 100644 --- a/src/Files.App/App.xaml.cs +++ b/src/Files.App/App.xaml.cs @@ -234,7 +234,7 @@ private async void Window_Closed(object sender, WindowEventArgs args) !Process.GetProcessesByName("Files").Any(x => x.Id != Environment.ProcessId)) { // Close open content dialogs - UIHelpers.CloseAllDialogs(); + await UIHelpers.CloseAllDialogsAsync(); // Close all notification banners except in progress statusCenterViewModel.RemoveAllCompletedItems(); diff --git a/src/Files.App/Helpers/UI/UIHelpers.cs b/src/Files.App/Helpers/UI/UIHelpers.cs index cfc1bd5327d5..f68f77ed7546 100644 --- a/src/Files.App/Helpers/UI/UIHelpers.cs +++ b/src/Files.App/Helpers/UI/UIHelpers.cs @@ -102,6 +102,26 @@ public static void CloseAllDialogs() dialog.Hide(); } + public static async Task CloseAllDialogsAsync() + { + if (MainWindow.Instance?.Content?.XamlRoot == null) + return; + + var openedDialogs = VisualTreeHelper.GetOpenPopupsForXamlRoot(MainWindow.Instance.Content.XamlRoot); + var closingTasks = new List(); + foreach (var item in openedDialogs) + { + if (item.Child is ContentDialog dialog) + { + var tcs = new TaskCompletionSource(); + dialog.Closed += (s, e) => tcs.SetResult(); + dialog.Hide(); + closingTasks.Add(tcs.Task); + } + } + await Task.WhenAll(closingTasks); + } + private static IEnumerable SidebarIconResources = LoadSidebarIconResources(); private static IconFileInfo ShieldIconResource = LoadShieldIconResource();