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