Фокусируемая панель в WPF - PullRequest
       28

Фокусируемая панель в WPF

6 голосов
/ 12 ноября 2009

Мне нужно сделать Panel фокусируемой в WPF, чтобы она фиксировала события клавиатуры, как и любой другой фокусируемый элемент управления:

  • Пользователь щелкает внутри панели, чтобы выделить ее
  • любое KeyDown или KeyUp событие возникает на уровне панели
  • если щелкнуть другой фокусируемый элемент вне панели, панель теряет фокус

Я экспериментировал FocusManager.IsFocusScope="True" на Panel, а myPanel.Focus() возвращает true, но обработчик событий Panel KeyUp по-прежнему не вызывается.

Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 12 ноября 2009

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

Я только что добавил обработчик для события KeyDown с помощью e.Handled = true; и теперь все работает правильно.

Подводя итог, чтобы получить фокусируемую панель:

  • добавить FocusManager.IsFocusScope="True" на панель
  • предотвратить потерю фокуса на стрелках и клавише Tab с помощью:
myPanel.KeyDown += new KeyEventHandler(
    delegate(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Left ||
            e.Key == Key.Up ||
            e.Key == Key.Right ||
            e.Key == Key.Down ||
            e.Key == Key.Tab)
            e.Handled = true;
    }
);

Наконец, дайте ему фокус с myPanel.Focus();.

1 голос
/ 12 ноября 2009

Если ваша панель не содержит дочерних элементов, даже использование FocusManager.IsFocusScope="True" не вызовет событие GotFocus. Панель не предназначена для ввода с клавиатуры или фокусировки. Вместо этого, в большинстве случаев (например, если дочерний элемент является элементом управления Button) FocusManager.IsFocusScope="True" даже поглощает события KeyUp / KeyDown. Событие не будет запущено ни для вашего контроля, ни для вашей панели.

...