2010-12-15 37 views
4

これは本当に簡単ですが、間違いなく期待どおりに動作していません。 WPF 4.0では、キーボードショートカットを受け入れるメニューバーを持つウィンドウを作成しようとしています...単純なウィンドウ、上部のメニューバー、およびその他のもの(AvalonDock、これは問題の一部である可能性があります) )。wpfキーボードフォーカス:メニューが開いた後でフォーカスが失われますか?

1つのキャッチがあります:メニューバー&コンテンツはウィンドウの直接のコンテンツである別のユーザーコントロール(それは私に悲しいパンダを作っているので、のはSadPandaそれを呼びましょう)です。

<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(); }; 
論理的階層は、この(ない実際のXAML)のようになります

メニューバー&のショートカットには、SadPandaにバインドされているのコマンドがルーティングされています。キーボードのフォーカスが失われた場合、入力ジェスチャは機能しなくなります。私はこれを加えました:

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

...そして、それはSadPanda自体ではなく、ウィンドウにフォーカスが戻っているようです。ウィンドウにFocusable = "False"を設定すると、フォーカスはnullになります。コントロールは決して考慮されません。私は(コメントでアルファ - マウスによって提案された)試してみました:

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

でも、これは動作しません - それは今までのフォーカスを取得してから開口部(彼らは、その後消えて、第二のオープン点滅)、またはテキストボックスからメニューを防ぎます...理由は分かりません。完璧な解決策のようです。

基本的には、ユーザーコントロールにウィンドウではなくトップレベルのキーボードフォーカスが必要です。これを達成する最も簡単な方法は何ですか?

答えて

3

この作品、なぜ私はまだわからないんだけど、ここで私が見つけたソリューションです:

  1. ウィンドウFocusable="False"FocusManager.IsFocusScope="False"を設定しますが。
  2. コントロールにFocusable="True"およびFocusManager.IsFocusScope="True"を設定します。

3つ。次を使用します。

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

私はより明白window.GotKeyboardFocusにはないながら、なぜこの作品わからないんだけど、それはあなたのためのWPFのです。

1

ハックの右側にあります。 Window.GotKeyboardFocusを処理してすぐにSadPandaにフォーカスすることができます。しかし、より良いソリューションがあるかもしれません。

+0

試しました。うまくいかない; - P。何らかの理由で、これにより、メニューが開くとすぐにメニューが閉じます。 –

関連する問題