У меня есть запрос на вход в качестве приложения WPF - когда пользователь вводит неверный пароль, появляется новое модальное диалоговое окно, информирующее их о том, что их пароль неверен.
Этот модальный диалог запускается с помощью ShowDialog()
и ведет себя как и ожидалось - диалог запускается успешно, появляется перед приглашением на входе, которое породило его (я проверил в отладчике, что Owner
правильно настроен в приглашении на вход), и пользователь не может вернуться к диалоговому окну входа, пока не будет отправлено предупреждающее сообщение.
В рамках внешнего требования у нас есть альтернативный исполняемый файл запуска, который устанавливает атрибут UIaccess в файле манифеста равным true
. Мне лично это не нравится, но из-за требований бизнеса его нельзя удалить. Помимо отличия файла манифеста, регулярная пусковая установка и эта альтернативная версия запускают тот же самый код, те же DLL и т.д.
Здесь проблема: в этой версии UIaccess, когда пользователь вводит неверный пароль, диалоговое предупреждение о недопустимых учетных данных появляется за диалоговым окном входа. Тогда пользователь не может взаимодействовать с какой-либо частью приложения, потому что код все еще ожидает разрешения ShowDialog()
, и из-за этого диалоговое окно входа в систему отключено.
Хотя мы смогли решить эту проблему, добавив проверку конструктору модального диалогового окна, которое выглядит так (в диалоговом окне входа всегда установлено значение Topmost=true
, это условие гарантирует, что другие диалоговые окна одного типа не являются обязательно Topmost
):
if (owner != null && owner.Topmost)
Topmost = true;
Мы по-прежнему замечаем какое-то поведение, которое отличается между двумя версиями, но только в том, как отображаются этот диалог входа в систему и его модальное приглашение - теперь модальное окно отображается сверху по желанию, но пользователь может щелкнуть диалоговое окно входа в систему будет двигаться вверх, хотя он по-прежнему отключен.
Корень вопроса: почему атрибут UIAccess изменяет поведение ShowDialog()
таким образом? Если оба диалога и модальное окно находятся в одном и том же потоке, почему их относительные позиции должны быть изменены, установив UIAccess для всего приложения?