Закройте все открытые модальные диалоговые окна - PullRequest
3 голосов
/ 23 февраля 2011

У меня есть приложение WPF, в котором есть несколько модальных окон, используемых для различных целей. Это легко сделать с помощью функции ShowDialog. Тем не менее, в моем приложении у меня есть таймер для измерения времени простоя (то есть без движения мыши или нажатия клавиш), который приведет к выходу пользователя из системы. Есть ли способ (при срабатывании этого таймера) найти и закрыть все открытые модальные окна без явного отслеживания каждого из них?

Обновление Я также хотел бы закрыть все экземпляры MessageBox.Show. Это возможно?

Спасибо, Matt

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011

Есть ли способ (когда срабатывает этот таймер) найти и закрыть все открытые модальные окна без явного отслеживания каждого из них?

Вы можете использовать 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);
  }

Это, к сожалению, может быть изменено (поскольку он использует недокументированные закрытые члены).

3 голосов
/ 23 февраля 2011

Вы пытались выполнить итерацию коллекции Application.Current.Windows и закрыть все, что не является Application.Current.MainWindow?

Jogy

...