Sie haben Recht. WPF hat den logischen Fokus, den Sie dort verwenden, und den Tastaturfokus. Sie können alle Details der beiden auf der Focus Overview Seite von MSDN finden. Von dieser Seite:
Tastaturfokus
Tastaturfokus bezieht sich auf das Element, das zur Zeit Tastatureingabe empfängt. Auf dem gesamten Desktop kann nur ein Element mit Tastaturfokus vorhanden sein. In WPF wird IsKeyboardFocused für das Element mit Tastaturfokus auf True gesetzt. Die statische Eigenschaft FocusedElement für die Keyboard-Klasse ruft das Element ab, das derzeit über den Tastaturfokus verfügt.
Damit ein Element den Tastaturfokus erhalten kann, müssen die Eigenschaften Focusable und IsVisible auf den Basiselementen auf true festgelegt werden. Einige Klassen, z. B. die Panel-Basisklasse, haben Focusable standardmäßig auf false festgelegt. Daher müssen Sie Focusable auf True setzen, wenn ein solches Element den Tastaturfokus erhalten soll.
Der Tastaturfokus kann durch Benutzerinteraktion mit der Benutzeroberfläche abgerufen werden, z. B. das Einfassen eines Elements oder das Klicken auf bestimmte Elemente. Der Tastaturfokus kann auch programmgesteuert mithilfe der Focus-Methode für die Keyboard-Klasse abgerufen werden. Die Focus-Methode versucht, dem angegebenen Element den Tastaturfokus zuzuweisen. Das zurückgegebene Element ist das Element mit Tastaturfokus, das möglicherweise ein anderes Element als angefordert ist, wenn entweder das alte oder das neue Fokusobjekt die Anforderung blockieren.
Logical Fokus
Logical Fokus bezieht sich auf die FocusManager.FocusedElement in einen Fokusbereich. Ein Fokusbereich ist ein Element, das das FocusedElement in seinem Bereich verfolgt. Wenn der Fokus der Tastatur einen Fokusbereich verlässt, verliert das fokussierte Element den Tastaturfokus, behält jedoch den logischen Fokus bei. Wenn der Tastaturfokus zum Fokusbereich zurückkehrt, erhält das fokussierte Element den Tastaturfokus. Dies ermöglicht das Ändern des Tastaturfokus zwischen mehreren Fokusbereichen, stellt jedoch sicher, dass das fokussierte Element im Fokusbereich den Tastaturfokus wiedererlangt, wenn der Fokus zum Fokusbereich zurückkehrt.
Es kann mehrere Elemente geben, die in einer Anwendung den logischen Fokus haben, aber möglicherweise gibt es nur ein Element, das in einem bestimmten Fokusbereich einen logischen Fokus hat.
Ein Element mit Tastaturfokus hat einen logischen Fokus für den Fokusbereich, zu dem es gehört.
kommend auf Ihre Frage zurück, die andere Art von Fokus, die Sie nicht ist Keyboard.Focus
verwenden. Sie können es wie folgt verwenden:
Keyboard.Focus(theButtonThatYouWantToFocus);
Beachten Sie auch, dass die UIElement.Focus()
Methode versuchen, sowohl logische und Tastaturfokus auf das Element zu setzen, dass es auf genannt. Es wird true
zurückgegeben, wenn Tastaturfokus und logischer Fokus auf dieses Element gesetzt wurden und false
wenn nur logischer Fokus auf dieses Element gesetzt wurde.
Eine andere Methode, die Sie Kontrollen konzentrieren verwenden können, ist die FocusManager.FocusedElement
Attached Property
zu verwenden. Die meisten Leute benutzen diese statisch und in diesem Fall wird dies nur einmal funktionieren, wenn die Sicht Lasten:
<Grid FocusManager.FocusedElement="{Binding ElementName=TextBoxToFocus}">
<TextBox Name="TextBoxToFocus" Text="Focus Me" />
<Grid>
aber es möglich ist, dies in einem DataTrigger
zu verwenden und sie auf einer benutzerdefinierten bool
Eigenschaft abhängig zu setzen , in diesem Beispiel die IsFocused
Eigenschaft:
<Style x:Key="FocusableTextBoxStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsFocused}" Value="True">
<Setter Property="FocusManager.FocusedElement"
Value="{Binding RelativeSource={RelativeSource Self}}" />
</DataTrigger>
</Style.Triggers>
</Style>
Also, wenn ich die IsFocused
Eigenschaft auf true aus dem view-Modell, jedes Element mit diesen Style
erhält angewendet logischen Fokus. Jetzt ist dies eindeutig Style
für die TextBox
Kontrolle, aber es funktioniert immer noch, wenn Sie es zum Beispiel zu Control
ändern.
Großartig! Ich habe Keyboard.Focus (setFocus) hinzugefügt, als ich den logischen Fokus einstellte und jetzt funktioniert es, vielen Dank! – Sam
Sie können Ihren Capture/Restore-Code mit [FocusManager.IsFocusScope] (http://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.isfocusscope) möglicherweise vollständig beseitigen. aspx). – Olly
* Bei einigen Klassen, z. B. der Panel-Basisklasse, ist Focusable standardmäßig auf false gesetzt *. Das war der Schlüssel für mich. – dotNET