Tipps und Tricks zu Fenstern und Steuerelementen

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

In dieser Reihe unserer Tipps und Tricks erfahren Sie einiges über Fenster und Steuerelemente: Wie setzen Sie den Fokus auf ein Steuerelement Wie legen Sie die Aktivierreihenfolge von Steuerelementen fest Wie zentrieren Sie ein Fenster Wie öffnen Sie ein Fenster relativ zum aufrufenden Fenster Wie übergeben Sie Parameter beim Öffnen an ein Fenster Wie legen Sie ein Anwendungssymbol fest und wie eines für ein einzelnes Fenster Mehr dazu auf den folgenden Seiten!

Fokus auf ein Steuerelement setzen

Im Gegensatz zu Access-Formularen landet der Fokus unter WPF nicht unbedingt sichtbar auf einem Steuerelement.

Daher schauen wir uns nun an, wie Sie den Fokus etwa beim Öffnen des Fensters auf das gewünschte Steuerelement verschieben. Dazu gibt es mindestens zwei Methoden: eine per XAML und eine per C#.

Um beide auszuprobieren, fügen wir dem Fenster MainWindow zwei Schaltflächen hinzu, mit denen wir die beiden weiteren Fenster FokusPerXAML und FokusPerCSharp öffnen. Beide sollen den Fokus jeweils auf das erste Textfeld verschieben (siehe Bild 1).

Unter XAML legen Sie in einem übergeordneten Element des betroffenen Elements fest, welches Element den Fokus erhalten soll – in diesem Fall im Grid-Element. Dort fügen Sie das Attribut FocusManager.FocusedElement hinzu und tragen als Wert “{Binding ElementName=textBox}” ein. Alles lässt sich einfach per IntelliSense hinzufügen:

<Window x:Class="TippsControls.FokusPerXAML" ...                                      Title="FokusPerXAML">
     <Grid FocusManager.FocusedElement=
                           "{Binding ElementName=textBox}">
         <Label x:Name="label" Content="Label:" .../>
         <TextBox x:Name="textBox" Text="TextBox" .../>
         ...
     </Grid>
</Window>

Das Textfeld textBox erhält dann gleich nach dem Öffnen des Fensters den Fokus. Unter C# ist es noch etwas einfacher. Hier definieren Sie mit dem Attribut Loaded den Ereignishandler, der beim Laden des Fensters aufgerufen werden soll:

<Window ... Loaded="Window_Loaded">
     ...
</Window>

Dann fügen Sie der entsprechenden Methode eine einzige Anweisung hinzu, welche die Methode Focus des Steuerelements aufruft:

private void Window_Loaded(...) {
     this.textBox.Focus();
}

Damit verschiebt auch diese Variante beim Öffnen den Fokus auf das erste Textfeld.

Aktivierreihenfolge festlegen

Unter Access haben Sie die Aktivierreihenfolge in einem speziell dafür vorgesehenen Dialog festgelegt. Unter WPF läuft das etwas anders. Wenn Sie nichts weiter tun, entspricht die Aktivierungsreihenfolge der Reihenfolge, in der Sie die Elemente im XAML-Code angelegt haben. Solange diese Reihenfolge der gewünschten Aktivierreihenfolge entspricht, ist alles okay.

Wenn Sie aber nun beispielsweise ein neues Textfeld plus Bezeichnungsfeld (Label) aus der Toolbox zwischen zwei vorhandene Textfelder einfügen, funktioniert die Aktivierreihenfolge nicht mehr wie gewünscht. Nun wird erst das erste, dann das dritte und schließlich das zweite Textfeld aktiviert. Um dies zu ändern, müssten Sie also die Reihenfolge der Elemente im XAML-Code anpassen.

Davon abgesehen, dass ein wenig Ordnung im XAML-Code nicht schaden kann, kann es natürlich Gründe geben, eine Aktivierreihenfolge vorzugeben, die nicht von der Gestaltung des XAML-Codes abhängt. Für solche Fälle bietet WPF das Attribut KeyboardNavigation.TabIndex an, das Sie für alle relevanten Steuerelemente hinzufügen:

<Window x:Class="TippsControls.Aktivierreihenfolge" ...>
     <Grid>
         <Label x:Name="label1" .../>
         <TextBox x:Name="txt1" ...
             KeyboardNavigation.TabIndex="1" />
         <Label x:Name="label2" .../>
         <TextBox x:Name="txt2" ... 
             KeyboardNavigation.TabIndex="2"/>
         ...
     </Grid>
</Window>

Soll ein Steuerelement gar nicht in die Aktivierreihenfolge einbezogen werden, stellen Sie das Attribut IsTabStop auf den Wert False ein:

 

Schreibe einen Kommentar