Es scheint, dass beim Start einer WPF-Anwendung nichts den Fokus hat.
Das ist wirklich komisch. Jedes andere Framework, das ich verwendet habe, macht genau das, was Sie erwarten: Konzentriert sich zunächst auf das erste Steuerelement in der Tabulatorreihenfolge. Ich habe jedoch bestätigt, dass es sich um WPF handelt, nicht nur um meine App. Wenn ich ein neues Fenster erstelle und einfach eine TextBox einfüge und die App ausführe, hat die TextBox keinen Fokus, bis ich darauf klicke oder die Tabulatortaste drücke . Yuck.
Meine eigentliche App ist komplizierter als nur eine TextBox. Ich habe mehrere Ebenen von UserControls in UserControls. Eines dieser UserControls verfügt über die Handler Focusable = "True" und KeyDown / KeyUp, und ich möchte, dass es den Fokus hat, sobald sich mein Fenster öffnet. Ich bin allerdings immer noch ein WPF-Neuling, und ich habe nicht viel Glück, herauszufinden, wie das geht.
Wenn ich meine App starte und die Tabulatortaste drücke, wird der Fokus auf meine fokussierbare Steuerung gelegt und funktioniert wie gewünscht. Ich möchte jedoch nicht, dass meine Benutzer die Tabulatortaste drücken müssen, bevor sie das Fenster verwenden können.
Ich habe mit FocusManager.FocusedElement herumgespielt, bin mir aber nicht sicher, auf welches Steuerelement es eingestellt werden soll (das Fenster der obersten Ebene? Das übergeordnete Steuerelement, das das fokussierbare Steuerelement enthält? Das fokussierbare Steuerelement selbst?) Oder auf was es eingestellt werden soll.
Was muss ich tun, damit mein tief verschachteltes Steuerelement beim Öffnen des Fensters den ersten Fokus erhält? Oder noch besser, um das erste fokussierbare Steuerelement in der Tabulatorreihenfolge zu fokussieren?
Ich hatte die gute Idee, in Reflector zu stöbern, um zu sehen, wo die Focusable-Eigenschaft verwendet wird, und fand meinen Weg zu dieser Lösung. Ich muss nur den folgenden Code zum Konstruktor meines Fensters hinzufügen:
Dadurch wird automatisch das erste Steuerelement in der Tabulatorreihenfolge ausgewählt. Dies ist also eine allgemeine Lösung, die in jedes Fenster und in Just Work eingefügt werden kann.
quelle
Button
. Um dies zu beheben, drehe ich denMoveFocus
Anruf mitContextIdle
Priorität über den Dispatcher (Background
oder höher funktioniert nicht). Es gibt auch eineFocusNavigationDirection.First
, die der Absicht besser entspricht und in diesem Fall dasselbe tut.Basierend auf der akzeptierten Antwort, die als angehängtes Verhalten implementiert wurde:
Verwenden Sie es so:
quelle
DependencyProperty.RegisterAttached
. Der dritte Parameter solltetypeof(FocusBehavior)
nicht seintypeof(Control)
. Durch diese Änderung wird verhindert, dass der Designer die Eigenschaft 'FocusFirst' meldet, die bereits durch 'Control'-Fehler registriert wurde.Ich habe eine andere mögliche Lösung gefunden. Mark Smith hat eine FirstFocusedElement-Markup-Erweiterung zur Verwendung mit FocusManager.FocusedElement veröffentlicht.
quelle
Nach einem 'WPF Initial Focus Nightmare' und basierend auf einigen Antworten auf dem Stapel erwies sich das Folgende für mich als die beste Lösung.
Fügen Sie Ihrer App.xaml OnStartup () zunächst Folgendes hinzu:
Fügen Sie dann das Ereignis 'WindowLoaded' auch in App.xaml hinzu:
Das Threading-Problem muss verwendet werden, da der anfängliche Fokus von WPF aufgrund einiger Framework-Race-Bedingungen meistens fehlschlägt.
Ich fand die folgende Lösung am besten, da sie global für die gesamte App verwendet wird.
Ich hoffe es hilft...
Oran
quelle
BeginInvoke
anstelle dieser beängstigendenSleep(100)
Aussage.Hatte das gleiche Problem mit einfacher Lösung gelöst: Im Hauptfenster:
In der Benutzersteuerung:
quelle
Sie können das Steuerelement problemlos selbst als fokussiertes Element in XAML festlegen.
Ich habe noch nie versucht, dies in einer Benutzersteuerung festzulegen und zu prüfen, ob dies funktioniert, aber es kann sein.
quelle
Eine minimale Version von Mizipzors Antwort für C # 6+.
Verwendung in Ihrer XAML:
quelle
Wenn Sie wie ich sind und einige Frameworks verwenden, die das grundlegende Fokusverhalten irgendwie durcheinander bringen und alle oben genannten Lösungen irrelevant machen, können Sie dies trotzdem tun:
1 - Beachten Sie das Element, das den Fokus erhält (was auch immer es ist!)
2 - Fügen Sie dies in Ihren Code hinter xxx.xaml.cs ein
3 - Fügen Sie dies zu dem Element hinzu, das den ersten Fokus erhält:
4 - Fügen Sie die Element_GotFocus-Methode in den Code dahinter ein und geben Sie das WPF-benannte Element an, das den ersten Fokus benötigt:
5 - Verwalten Sie das geladene Ereignis
in XAML
in xaml.cs
Hoffe, dies wird als letzter Ausweg helfen
quelle
Ich hatte auch das gleiche Problem. Ich hatte drei Textfelder im Canvas-Container und wollte, dass das erste Textfeld beim Öffnen des Benutzersteuerelements fokussiert wird. Der WPF-Code folgte dem MVVM-Muster. Ich habe eine separate Verhaltensklasse zum Fokussieren des Elements erstellt und es so an meine Ansicht gebunden.
Canvas-Verhaltenscode
Code zur Ansicht
quelle
Die obige Lösung hat bei mir nicht wie erwartet funktioniert. Ich habe das von Mizipzor vorgeschlagene Verhalten wie folgt geringfügig geändert:
Von diesem Teil
Dazu
Und ich hänge dieses Verhalten nicht an Window oder UserControl an, aber zur Steuerung möchte ich mich zunächst konzentrieren, z.
Oh, entschuldigen Sie die unterschiedliche Benennung. Ich verwende den InitialFocus-Namen für die angehängte Eigenschaft.
Und das funktioniert für mich, vielleicht könnte es jemand anderem helfen.
quelle
quelle