WPF - Почему не работает Keyboard.Focus()?

есть элемент TextBox (MyTextBox) в элементе управления TabItem. У меня есть код, который выглядит следующим образом:

MyTextBox.Focus();
Keyboard.Focus(MyTextBox);

Когда я запускаю этот код через отладчик, я вижу следующее после выполнения строк:

MyTextBox.IsFocused = true
MyTextBox.IsKeyboardFocused = false

Может ли кто-нибудь сказать мне, почему текстовое поле не получает фокус клавиатуры? Это только стандартный элемент управления TextBox, который включен.

Ответы

Ответ 1

MyTextBox.IsKeyboardFocused является ложным, потому что вы смотрите на него под отладчиком, и фокус клавиатуры, вероятно, находится в вашей Visual Studio... Попробуйте отлаживать фокус без точек останова (например, Debug.Write или отслеживать brakepoints), чтобы увидеть фактические значения MyTextBox.IsKeyboardFocused во время выполнения.

Также обратите внимание, что метод Focus() возвращает логическое значение, указывающее, успешно ли установлен фокус. Возвращает ли оно False в вашем случае? Если да, я бы предложил перейти в метод Focus(), чтобы узнать, что не так.

Ответ 2

Когда вы пытаетесь установить Focus на элемент, помимо вещей, перечисленных выше нашим коллегией, вы также должны знать, что WPF не разрешает операции с поперечной резьбой.

В некоторых случаях это исключение не возникает, как в случае вызова метода Focus. То, что я сделал, чтобы исправить эту проблему, - это вызвать весь код, который включает в себя фокус клавиш в действии.

Это действие выполняется внутри диспетчера управления, чтобы убедиться, что мой код не выполняется из другого потока, кроме потока пользовательского интерфейса (например, событие таймера или событие, поднятое из другого потока):

[UIElement].Dispatcher.BeginInvoke(
      new Action(
         delegate{
             /// put your Focus code here
         }
      )
);

Ответ 4

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

Я нашел это здесь, решая проблему (и на самом деле получаю фокус, а не только настройки значений, чтобы он выглядел как фокус в отладчике), он очень близок к ответу Павлова, но с "кодом фокуса": Keyboard.Focus не работает в текстовом поле в WPF