Как решить эту проблему с LostFocus / LostKeyboardFocus?

Хорошо, у меня есть элемент управления, который имеет свойство IsEditing, которое для аргумента имеет шаблон по умолчанию, который обычно является текстовым блоком, но когда IsEditing является правда, он заменяет текстовое поле для редактирования на месте. Теперь, когда элемент управления теряет фокус, если он все еще редактирует, он ' s должен выйти из режима редактирования и вернуться обратно в шаблон TextBlock. Довольно прямолинейно, не так ли?

Подумайте о поведении при переименовании файла в проводнике Windows или на рабочем столе (это то же самое, что я знаю ...) Это то поведение, которое мы хотим.

Проблема в том, что вы можете не использовать событие LostFocus, потому что при переключении в другое окно (или элемент, являющийся FocusManager) LostFocus не срабатывает, поскольку элемент управления все еще имеет логический фокус, поэтому это не сработает.

Если вы вместо этого используете LostKeyboardFocus, хотя это решает проблему «другого FocusManager», теперь у вас есть новый: когда вы редактируете и щелкаете правой кнопкой мыши текстовое поле, чтобы отобразить контекстное меню, поскольку контекстное меню теперь имеет фокус клавиатуры, ваш элемент управления теряет клавиатуру focus, выходит из режима редактирования и закрывает контекстное меню, сбивая пользователя с толку!

Теперь я попытался установить флаг, чтобы игнорировать LostKeyboardFocus непосредственно перед открытием меню, а затем использовал этот флаг в событии LostKeyboardFocus, чтобы определить, вывести его из режима редактирования или нет, но если меню открыто и я нажимаю в другом месте приложения, поскольку у самого элемента управления больше нет фокуса клавиатуры (он есть в меню), элемент управления никогда не получает другого события LostKeyboardFocus, поэтому он остается в режиме редактирования. (Возможно, мне придется добавить проверку, когда меню закрывается, чтобы увидеть, что находится в фокусе, а затем вручную выкинуть его из EditMode, если это не элемент управления. Это кажется многообещающим.)

Итак ... кто-нибудь знает, как я могу успешно кодируете это поведение?

Mark

10
задан MarqueIV 1 May 2011 в 22:51
поделиться