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

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

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

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

Я что-то упускаю?


person Mart    schedule 12.11.2009    source источник


Ответы (2)


После дополнительного исследования 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();.

person Mart    schedule 12.11.2009

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

person Yogesh    schedule 12.11.2009
comment
Это то, что я понял, но остается вопрос: что мне нужно, чтобы панель была настраиваемой? Я хочу расширить его (возможно, заимствовав его), чтобы дать ему эту функцию. - person Mart; 12.11.2009
comment
Март, может потребоваться вывести панель из IInputElement? Просто предположение - person Jack Ukleja; 31.01.2011