Идиоматический код является кодом, который делает общую задачу в распространенном способе для Вашего языка. Это подобно шаблону разработки, но в намного меньшем масштабе. Идиомы отличаются широко языком. Одна идиома в C# могла бы быть должна использовать итератор для итерации через набор, а не цикличное выполнение через него. Другие языки без итераторов могли бы полагаться на идиому цикла.
После дополнительного исследования Panel имеет фокус клавиатуры и сохраняет его пока не будет нажата клавиша со стрелкой или TAB (что запустит циклическое переключение фокуса).
Я только что добавил обработчик для события KeyDown
с ʻe.Handled = true; ' и теперь все работает правильно.
Подводя итог, чтобы иметь фокусируемую панель:
FocusManager.IsFocusScope = "True"
в панель myPanel.KeyDown + = new KeyEventHandler ( делегат (отправитель объекта, 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 ();
.
Если ваша панель не содержит дочерних элементов, даже использование FocusManager.IsFocusScope = "True"
не вызовет событие GotFocus. Панель не предназначена для ввода с клавиатуры или фокусировки. Вместо этого в большинстве случаев (например, если дочерний элемент является элементом управления Button) FocusManager.IsFocusScope = "True"
даже поглощает события KeyUp / KeyDown. Событие не будет запущено ни для вашего элемента управления, ни для вашей панели.