2010-12-15 81 views
4

Cela semble vraiment facile, mais ça ne fonctionne vraiment pas comme prévu. Dans WPF 4.0, j'essaye de créer une fenêtre avec une barre de menu qui accepte les raccourcis clavier ... Juste une simple fenêtre, une barre de menu en haut, et d'autres choses (à l'intérieur AvalonDock, qui peuvent faire partie du problème).Mise au point du clavier wpf: perte de focus après l'ouverture du menu?

Il y a un hic: le contenu barre de menu & sont dans un autre contrôle utilisateur (appelons-le SadPanda, parce que ça me rend un panda triste) qui est le contenu direct de la fenêtre. La hiérarchie logique ressemble à quelque chose comme ça (pas XAML réelle):

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

Le contenu de la fenêtre doit avoir accès à la poignée de la fenêtre, il est donc mis après le chargement de la fenêtre comme ceci:

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

Les raccourcis de la barre de menu & ont commandes routées qui sont liés à SadPanda, et lorsque le focus du clavier est perdu, les gestes d'entrée ne fonctionnent plus, d'où le panda triste. J'ai ajouté ceci:

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

... et il semble que le foyer retourne à la fenêtre, plutôt qu'à SadPanda lui-même. Si je mets Focusable = "False" sur la fenêtre, alors le focus va à null; le contrôle n'est même jamais considéré. J'ai essayé (suggéré par l'alpha-souris dans les commentaires):

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

Même cela ne fonctionne pas - il empêche les menus de l'ouverture (ils clignotent ouvert pour une seconde, puis disparaissent) ou des zones de texte de mise au point jamais obtenir ... Pas certain de pourquoi; Cela semble être la solution parfaite.

Fondamentalement, je veux que le contrôle de l'utilisateur ait le focus sur le clavier de haut niveau, pas la fenêtre. Quel est le moyen le plus facile d'y parvenir?

Répondre

3

Je ne suis toujours pas sûr pourquoi cela fonctionne, mais voici la solution que je trouve:

  1. Set Focusable="False" et FocusManager.IsFocusScope="False" sur la fenêtre .
  2. Définissez Focusable="True" et FocusManager.IsFocusScope="True" sur le contrôle.

Trois. Utilisez les commandes suivantes:

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

Je ne sais pas pourquoi cela fonctionne alors que le window.GotKeyboardFocus plus évident ne le fait pas, mais c'est WPF pour vous.

1

À droite d'un hack. Vous pouvez gérer Window.GotKeyboardFocus pour concentrer immédiatement SadPanda. Mais peut-être y at-il des solutions plus agréables.

+0

Je l'ai essayé; ne fonctionne pas ;-P. Pour une raison quelconque, le menu se ferme instantanément dès qu'il s'ouvre. –