これは本当に簡単ですが、間違いなく期待どおりに動作していません。 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); };
でも、これは動作しません - それは今までのフォーカスを取得してから開口部(彼らは、その後消えて、第二のオープン点滅)、またはテキストボックスからメニューを防ぎます...理由は分かりません。完璧な解決策のようです。
基本的には、ユーザーコントロールにウィンドウではなくトップレベルのキーボードフォーカスが必要です。これを達成する最も簡単な方法は何ですか?
試しました。うまくいかない; - P。何らかの理由で、これにより、メニューが開くとすぐにメニューが閉じます。 –