2009-11-12 3 views
6

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

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

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

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

ответ

2

После дополнительного исследования панель имеет фокус клавиатуры и удерживает ее до тех пор, пока не будет нажата клавиша со стрелкой или клавиша 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

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

+0

Вот что я понял, но остается вопрос: что мне нужно сделать панелью сфокусированной? Я хочу расширить его (возможно, получив его), чтобы дать ему эту функцию. – Mart

+0

Mart, Возможно, вам понадобится вывести панель из IInputElement? Просто догадка – Schneider