Итак, позвольте мне предупредить вас; Я прошу способ заставить полный хак работать несколько лучше. Я признаю, что это взлом, и я, безусловно, открыт для разных взглядов на проблему в целом. Тем не менее, мне нужно скоро это сделать, если я хочу сделать обрезку кода, и у нас довольно агрессивная дата выпуска.
Таким образом, я не смогу сразу же внести большие изменения, но я могу легко сделать это для первого патча к этому программному обеспечению. Поэтому приветствуются краткосрочные и долгосрочные решения, но предпочтительнее краткосрочное решение (если возможно).
Хорошо, вот в чем проблема; У меня есть приложение, которое отправляет команды на аппаратное устройство робота. После отправки команды, которая требует ожидания (например, физического движения, которое занимает неизвестное количество времени), пользовательский интерфейс переходит в «состояние занятости». Когда это происходит, все элементы управления, которые будут выдавать другую команду блокировки, отключаются, поскольку машина не может их обработать.
Когда пользовательский интерфейс выходит из состояния занятости, все элементы управления снова включаются, но порядок перехода по понятным причинам не поддерживается. Это делает невозможным переход по областям ввода и, поскольку я использую клавиатуру почти исключительно, неприемлемо. Моя текущая схема «решить» эту проблему заключается в следующем:
- При запуске зарегистрируйтесь в событии GotFocus для каждого интересующего элемента управления в приложении. Это затрудняется тем, что это приложение WPF MVVM, а также тем, что некоторые элементы управления создаются динамически. Тем не менее, я могу искать визуальные и / или логические деревья и добираться до ...
- В событии GotFocus сохраните ссылку на элемент управления.
- Когда мы выходим из занятого состояния, попытайтесь установить фокус на сохраненный элемент управления.
Это работает ... своего рода Сорта. Проблема под рукой (как я могу подумать о большем количестве сценариев сбоя ...) заключается в том, что эта логика уничтожит контекстное меню, если оно было открыто, и другое. Рассмотрим:
- Фокус в текстовой области.
- Пользователь щелкает правой кнопкой мыши другой элемент управления. Этот элемент управления не получает фокус (даже если я пытаюсь установить его в обработчике мыши).
- Система переходит в состояние занятости, когда щелчок правой кнопкой мыши выполняет перемещение.
- Когда состояние занятости заканчивается, текстовая область получает фокус, и контекстное меню закрывается.
(Теперь я понимаю, что вы можете сказать, что выполнение перемещения по правому клику, а также отображение контекстного меню - плохая идея, но команды контекстного меню неблокируют, активированы и имеют специфическое для домена использование, которое это удобно.)
Итак, вот оно. Я даже не могу сфокусироваться правой кнопкой мыши, и настройка фокуса на само меню тоже не работает. Мне просто любопытно, есть ли у кого-то лучшая схема для чего-то подобного. Я понимаю, что это неловкое и очень узкое обстоятельство. Спасибо за любую помощь, которую вы можете предложить заранее, я буду играть с этим еще немного ...