Я наткнулся на неприятность в WPF, которая, по-видимому, хорошо известна: элемент управления TextBox
иногда не теряет фокус (и, следовательно, не запускает свое событие LostFocus
). Например, если у вас есть фокус в текстовом поле и вы нажимаете кнопку, текстовое поле не теряет фокус с программной точки зрения.
Об этом говорится во многих вопросах и ответах, например этот и этот. Есть также много хакерских способов справиться с этим, но все, что я видел, вращались вокруг сохранения недавно измененных данных в текстовом поле, чтобы случайно не потерять последние изменения. Они достигают этого, принудительно обновляя источник при появлении команды «сохранить».
Однако у меня другая проблема: я пытаюсь обновить другие элементы управления в моем пользовательском интерфейсе на основе значения в текстовом поле. Итак, пользователь вводит значение в текстовое поле, и когда он покидает текстовое поле, это должно приводить к отображению вычисленных значений в других элементах управления. Однако это не происходит постоянно, когда текстовое поле не запускает событие LostFocus
постоянно.
Ни один из источников, которые я нашел, не сказал почему TextBox
ведет себя таким образом, хотя все они производят впечатление, что это нормальное поведение. Например, первое предложение этого ответа:
Проблема в том, что TextBox фактически не теряет фокус при активации пункта меню.
Вот и все. Автор продолжает, как будто это нормально.
Почему он так себя ведет, или, если точнее, намеренно, то какова его цель? И как я могу преодолеть это в моем случае, когда я хочу, чтобы другие элементы управления изменялись на основе вновь введенных данных в текстовое поле?
TextBox
потеряет фокус только в том случае, если другой элемент управления в той же области фокуса получит фокус (это приведет к исчезновению курсора сTextBox
). Таким образом, щелчок поButton
приведет кTextBox
потере фокуса, только если он находится в той же области фокусировки и способен получать фокус (в частности, его свойствоFocusable
читаетtrue
) и делает это при нажатии. - person Grx70   schedule 18.09.2016