2010-12-15 2 views
4

Das scheint wirklich einfach, aber es funktioniert definitiv nicht wie erwartet. In WPF 4.0 versuche ich, ein Fenster mit einer Menüleiste zu erstellen, die Tastaturkurzbefehle akzeptiert ... Nur ein einfaches Fenster, eine Menüleiste oben und einige andere Dinge (innerhalb AvalonDock, die Teil des Problems sein können).wpf tastatur fokus: verlieren fokus nach menü öffnet?

Es gibt einen Haken: die Menüleiste & Inhalt sind in einem anderen Benutzer Steuerelement (nennen wir es SadPanda, weil es mich einen traurigen Panda macht), das ist der direkte Inhalt des Fensters. Die logische Hierarchie sieht so etwas wie diese (nicht unbedingt die XAML):

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

Der Inhalt des Fensters muss Zugriff auf das Handle des Fensters, so ist es , nachdem die Fenster Lasten wie folgt festgelegt:

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

die Menüleiste & Verknüpfungen haben geroutet Befehle, die sadpanda gebunden sind, und wenn der Tastaturfokus verloren, die Eingabegesten nicht mehr arbeiten, also die traurige Panda. Ich fügte dieses hinzu:

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

... und es scheint, dass der Fokus zurück zum Fenster ist, anstatt zu SadPanda selbst. Wenn ich Focusable = "False" auf das Fenster setze, wird der Fokus auf null gesetzt; Die Kontrolle wird nie in Betracht gezogen. Ich habe versucht (von alpha-Maus in den Kommentaren vorgeschlagen):

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

Auch das funktioniert nicht - es verhindert, dass Menüs Öffnung (sie eine Sekunde lang offen, dann der verschwinden) oder Textfelder von je bekommen Fokus ... Nicht sicher warum; Es scheint die perfekte Lösung zu sein.

Grundsätzlich möchte ich, dass die Benutzersteuerung Top-Level-Tastatur Fokus haben, nicht das Fenster. Was ist der einfachste Weg, dies zu erreichen?

Antwort

3

Ich bin immer noch nicht sicher, warum dies funktioniert, aber hier ist die Lösung, die ich gefunden:

  1. Set Focusable="False" und FocusManager.IsFocusScope="False" auf dem Fenster.
  2. Focusable="True" und FocusManager.IsFocusScope="True" auf der Steuerung einstellen.

Drei. Verwenden Sie die folgenden:

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

Ich bin nicht sicher, warum das funktioniert, während die offensichtlicheren window.GotKeyboardFocus nicht der Fall ist, aber das ist WPF für Sie.

1

Auf der rechten Seite eines Hacks. Sie können mit Window.GotKeyboardFocus umgehen, um sofort auf SadPanda zu fokussieren. Aber vielleicht gibt es bessere Lösungen.

+0

Versucht es; funktioniert nicht ;-P. Aus irgendeinem Grund führt dies dazu, dass das Menü sofort geschlossen wird, sobald es geöffnet wird. –