Остановить текстовое поле WPF от потери фокуса - PullRequest
6 голосов
/ 06 февраля 2010

У меня есть WPF Textbox, и я хочу проверить правильность текстового значения, прежде чем позволю ему потерять клавиатуру / фокус.

Я пытался установить e.Handled в событиях InputBox_LostFocus & InputBox_LostKeyboardFocus, но, похоже, он не достигает того, чего я хочу.

Любые предложения о том, как я могу заблокировать фокус на Textbox?

Ответы [ 2 ]

7 голосов
/ 07 ноября 2014

Лучший способ сделать это - обработать событие PreviewLostKeyboardFocus, которое запускается во время туннелирования события до вашего текстового поля. Установите дескриптор на true, и больше ничего не получит уведомление (то есть фокус не будет перенесен из вашего текстового поля). Надеюсь, это поможет.

4 голосов
/ 06 февраля 2010

Вы можете позвонить Mouse.Capture на UIElement. Это даст вам каждое событие мыши, которое происходит независимо от того, находится он на элементе или нет. но его сложно использовать. Вы можете захватить мышь на своем текстовом поле и зарегистрироваться для потерянных событий захвата, когда вы потеряете захват, вы можете восстановить. Вы должны остерегаться странного поведения. Как правило, это плохая практика (я думаю) - не позволять пользователю уходить с поля. что лучше - позволить им делать все, что они захотят, но отключить кнопку, которую они нажимают после ввода данных, пока все поля не станут действительными (или что-то подобное)

Вот несколько ссылок

другой вопрос SO

Пример кода MSDN

поле со списком использует захват мыши, чтобы сказать, нажал ли пользователь в другом месте приложения, чтобы закрыть поле со списком, если оно открыто, если вы щелкнете по другому элементу управления (или вне окна)

Я не знаю, остановит ли вас эта техника, когда вы отключите элемент. В приложении wpf есть два вида фокуса. У вас есть логический фокус и клавиатурный фокус. Несколько элементов могут иметь логическую фокусировку одновременно (каждый в пределах фокуса). например, подумайте, что текстовое поле может иметь логический фокус, когда вы щелкаете меню (которое также имеет логический фокус). Фокус клавиатуры может быть только в одном месте одновременно. Вы собираетесь сделать много работы для себя. Я бы серьезно подумал, правильно ли вы взаимодействуете. Вы могли бы потратить дни, чтобы это взаимодействие было правильным. Если вы остановите текстовое поле, потеряв фокус, что произойдет, если пользователь нажмет кнопку закрытия?

вот статья msdn в фокусе

...