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