2010-12-15 5 views
4

Это кажется очень простым, но это определенно не работает должным образом. В WPF 4.0 я пытаюсь создать окно с панелью меню, которая принимает сочетания клавиш ... Простое окно, панель меню наверху и некоторые другие вещи (внутри AvalonDock, что может быть частью проблемы).фокус клавиатуры фокуса: потеря фокуса после открытия меню?

Существует один улов: панель меню & контента находятся в другом пользовательском контроле (назовем его SadPanda, потому что это делает меня печальной пандой), это прямое содержимое окна. Логическая иерархия выглядит примерно так (не фактического XAML):

<Window> 
    <UserControl x:Name="SadPanda" Focusable="True" FocusManager.IsFocusScope="True"> 
    <Grid> 
     <MenuBar/> 
     <AvalonDock:DockingManager> 
     <PandaFood> 
     </AvalonDock:DockingManager> 
    </Grid> 
    </UserControl> 
</Window> 

содержимое окна нуждается в доступе к Handle окна, поэтому он установлен после окна нагрузок как это:

window.Loaded += delegate { window.Content = new SadPanda(); }; 

В строке меню & ярлыки имеют маршрутизируемые команды, которые привязаны к SadPanda, а когда фокус клавиатуры потерян, жесты ввода больше не работают, а значит, печальная панда. Я добавил:

LostKeyboardFocus += (sender, e) => Debug.WriteLine("Lost focus to " + e.NewFocus); 
GotKeyboardFocus += (sender, e) => Debug.WriteLine("Got focus from " + e.OldFocus); 

... и кажется, что фокус возвращается к окну, а не к самой SadPanda. Если я устанавливаю Focusable = «False» в окне, тогда фокус будет равен нулю; контроль даже не рассматривается. Я попробовал (предложил альфа-мышь в комментариях):

window.GotKeyboardFocus += delegate { Keyboard.Focus(sadPanda); }; 

Даже это не работает - это предотвращает меню из отверстия (они мигают открыты в течение секунды, а затем исчезают) или текстовые блоки всегда получать фокус ... Не знаю, почему; это кажется идеальным решением.

В принципе, я хочу, чтобы пользовательский элемент управления имел фокус клавиатуры верхнего уровня, а не окно. Какой самый простой способ достичь этого?

ответ

3

Я до сих пор не знаю, почему это работает, но вот решение, которое я нашел:

  1. Набор Focusable="False" и FocusManager.IsFocusScope="False" на окне.
  2. Focusable="True" и FocusManager.IsFocusScope="True" на контроле.

Три. Используйте следующее:

PleasedPanda.LostKeyboardFocus += (sender, e) => 
{ 
    if(e.NewFocus == null) 
    { 
     Keyboard.Focus(PleasedPanda); 
    } 
} 

я не уверен, почему это работает, а тем более очевидным window.GotKeyboardFocus не делает, но это WPF для вас.

1

Справа от взлома. Вы можете обращаться с Window.GotKeyboardFocus, чтобы сразу сфокусировать SadPanda. Но могут быть более приятные решения.

+0

Пробовал; не работает ;-P. По какой-то причине это вызывает мгновенное закрытие меню сразу же после его открытия. – 2010-12-16 03:45:19

Смежные вопросы