В чем причина того, что TextBox не теряет фокус в определенных случаях, и как вы можете преодолеть это, если хотите, чтобы изменение запускало другие изменения пользовательского интерфейса?

Я наткнулся на неприятность в WPF, которая, по-видимому, хорошо известна: элемент управления TextBox иногда не теряет фокус (и, следовательно, не запускает свое событие LostFocus). Например, если у вас есть фокус в текстовом поле и вы нажимаете кнопку, текстовое поле не теряет фокус с программной точки зрения.

Об этом говорится во многих вопросах и ответах, например этот и этот. Есть также много хакерских способов справиться с этим, но все, что я видел, вращались вокруг сохранения недавно измененных данных в текстовом поле, чтобы случайно не потерять последние изменения. Они достигают этого, принудительно обновляя источник при появлении команды «сохранить».

Однако у меня другая проблема: я пытаюсь обновить другие элементы управления в моем пользовательском интерфейсе на основе значения в текстовом поле. Итак, пользователь вводит значение в текстовое поле, и когда он покидает текстовое поле, это должно приводить к отображению вычисленных значений в других элементах управления. Однако это не происходит постоянно, когда текстовое поле не запускает событие LostFocus постоянно.

Ни один из источников, которые я нашел, не сказал почему TextBox ведет себя таким образом, хотя все они производят впечатление, что это нормальное поведение. Например, первое предложение этого ответа:

Проблема в том, что TextBox фактически не теряет фокус при активации пункта меню.

Вот и все. Автор продолжает, как будто это нормально.

Почему он так себя ведет, или, если точнее, намеренно, то какова его цель? И как я могу преодолеть это в моем случае, когда я хочу, чтобы другие элементы управления изменялись на основе вновь введенных данных в текстовое поле?


person rory.ap    schedule 16.09.2016    source источник
comment
Это совершенно нормально, и все остальные библиотеки классов GUI работают таким же образом. Если бы это не сработало, то, скажем, команду меню Edit + Copy или Edit + Undo было бы довольно сложно реализовать.   -  person Hans Passant    schedule 17.09.2016
comment
Я не уверен, что следую, но по моему опыту (используя WinForms, а теперь начиная с WPF), пользовательский интерфейс может иметь только один сфокусированный элемент управления одновременно. Итак, если вы вводите текст в текстовое поле, а затем нажимаете кнопку, теперь фокус находится на кнопке (и соответствующее событие LostFocus сработало в текстовом поле).   -  person rory.ap    schedule 17.09.2016
comment
TextBox потеряет фокус только в том случае, если другой элемент управления в той же области фокуса получит фокус (это приведет к исчезновению курсора с TextBox). Таким образом, щелчок по Button приведет к TextBox потере фокуса, только если он находится в той же области фокусировки и способен получать фокус (в частности, его свойство Focusable читает true) и делает это при нажатии.   -  person Grx70    schedule 18.09.2016


Ответы (1)


Причина в том, что фокус - это сложнее, чем кажется. Если фокус находится в текстовом поле и вы переходите по Alt-Tab на другое приложение, вы действительно не хотите, чтобы ваша проверка срабатывала. Точно так же, если вы выделите какой-то текст, а затем откроете меню редактирования и выберете «копировать», вы не захотите потерять фокус на выделенном тексте.

LostFocus срабатывает только при переходе к другому элементу управления, который принимает фокус в том же приложении.

LostKeyboardFocus также срабатывает при переходе к другому приложению или меню.

person Robin Bennett    schedule 10.02.2020