Frage

Das scheint einfach, aber es ist auf jeden Fall nicht wie erwartet funktioniert. In WPF 4.0, versuche ich ein Fenster mit einer Menüleiste zu erstellen, die Tastaturbefehle akzeptiert ... Nur ein einfaches Fenster, eine Menüleiste am oberen Rande, und einige andere Sachen (innerhalb von AvalonDock , die ein Teil des Problems sein kann).

Da ist ein Haken: die Menüleiste und Inhalt in einer anderen Benutzersteuerung ist (nennen sie es SadPanda, weil es mir ein trauriges Panda machen), dass der direkte Inhalt des Fensters ist. 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 dass es den Satz , nachdem die Fenster Lasten wie folgt aus:

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

Die Menüleiste & Kürzel gerouteten Befehle , die zu sadpanda gebunden sind, und wenn der Tastaturfokus verloren, die Eingabegesten nicht mehr arbeiten, also die traurige Panda. Ich habe diese:

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 auf das Fenster zurückkehrt, anstatt zu sadpanda selbst. Wenn ich Fokussierbare = „False“ auf das Fenster gesetzt, dann geht der Fokus auf null; die Steuerung wird nicht einmal in Betracht gezogen. Ich habe versucht (vorgeschlagen von alpha-Maus in den Kommentaren):

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

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

Im Grunde möchte ich die Benutzersteuerung des obersten Ebene des Tastaturfokus hat, nicht das Fenster. Was ist der einfachste Weg, um dies?

zu erreichen
War es hilfreich?

Lösung

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. Set Focusable="True" und FocusManager.IsFocusScope="True" auf das Steuerelement.

Drei. Verwenden Sie die folgenden:

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

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

Andere Tipps

Auf der rechten Seite ein Hack. Sie können Window.GotKeyboardFocus sofort Fokus SadPanda behandeln. Aber kann es gibt schönere Lösungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top