Есть ли способ (когда срабатывает этот таймер) найти и закрыть все открытые модальные окна без явного отслеживания каждого из них?
Вы можете использовать ComponentDispatcher.IsThreadModal чтобы проверить, находится ли ваш пользовательский интерфейс в модальном состоянии.Если это так, свойство Application.Current.Windows выдаст вам список открытых окон.
Если у вас есть только одно MainWindow, вы можете закрыть любые другие (как онибыть вашими модальными диалоговыми окнами), но если у вас есть несколько окон, вам придется проверять каждое из них.
К сожалению, нет прямого API, чтобы определить, является ли конкретное окно модальным - но в закрытой переменной естькласс Window, который вы можете использовать для этого.Например, следующий метод использует отражение, чтобы определить, является ли окно модальным:
public static bool IsModal(Window window)
{
Type type = typeof(Window);
var field = type.GetField("_showingAsDialog", BindingFlags.Instance | BindingFlags.NonPublic);
return field.GetValue(window);
}
Это, к сожалению, может быть изменено (поскольку он использует недокументированные закрытые члены).