2010-12-15 156 views
4

這似乎很容易,但它絕對不能按預期工作。在WPF 4.0中,我試圖創建一個窗口,其中包含一個接受鍵盤快捷鍵的菜單欄......只是一個簡單的窗口,頂部的菜單欄和其他一些內容(AvalonDock,這可能是問題的一部分)。wpf鍵盤焦點:菜單打開後失去焦點?

有一個問題:菜單欄&內容位於另一個用戶控件(我們稱之爲SadPanda,因爲它使我成爲一隻悲傷的熊貓),這是窗口的直接內容。邏輯層次結構看起來是這樣的(而不是實際的XAML):

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

窗口的內容需要訪問窗口的句柄,所以它的窗口加載這樣設置後

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