This article has been localized into German by the community.
Tab-Reihenfolge
Wenn Sie lange genug mit einem Computer gearbeitet haben, um die Programmierung zu erlernen, wissen Sie wahrscheinlich auch, dass Sie mit der Tabulatortaste auf der Tastatur durch einen Windows-Dialog navigieren können. So können Sie beim Ausfüllen eines Formulars oder ähnlichem die Hände auf der Tastatur behalten, anstatt mit der Maus das nächste Steuerelement auswählen zu müssen.
WPF unterstützt dieses Verhalten von sich aus und noch besser: Es wird automatisch die Reihenfolge festgelegt, die beim Wechsel von einem Feld zum anderen verwendet wird, so dass Sie sich im Allgemeinen nicht darum zu kümmern brauchen. Manchmal führt jedoch das Design Ihres Dialogs dazu, dass WPF eine Tabulatorfolge verwendet, mit der Sie nicht einverstanden sind. Außerdem können Sie entscheiden, dass bestimmte Steuerelemente nicht per Tabulator erreichbar sein sollen. Lassen Sie uns das an diesem Beispiel betrachten:
Dieser Dialog besteht aus einem Grid, das in der Mitte geteilt ist, mit StackPanels auf jeder Seite, die Beschriftungen und Textfelder enthalten. Das Standard-Verhalten für die Tab-reihenfolge besteht darin, mit dem ersten Steuerelement des Fensters zu beginnen und dann durch jedes der darin enthaltenen untergeordneten Steuerelemente zu navigieren, bevor Sie zum nächsten Steuerelement wechseln. Da der Dialog aus vertikal ausgerichteten StackPanels besteht, würde das bedeuten, dass wir im Feld First Name beginnen und dann zum Feld Street name und dann zum Feld City wechseln würden, bevor wir zu StackPanel Nummer zwei wechseln, das die Felder für Last name und Zip Code enthält. Wenn Sie aus dem zweiten StackPanel heraus navigieren, werden zum Schluss die beiden Buttons erreicht.
Für diesen Dialog ist das jedoch nicht das Verhalten, das ich will. Stattdessen möchte ich vom First Name zu Last Name tabulieren (also grundsätzlich horizontal statt vertikal), und außerdem möchte ich beim Tabulieren durch das Formular das Feld City nicht erreichen, da es in diesem imaginären Dialog automatisch anhand des Zip Code ausgefüllt wird und daher nur zum Lesen dient. Um all dies zu erreichen, werde ich zwei Eigenschaften verwenden: TabIndex und IsTabStop. TabIndex wird verwendet, um die Reihenfolge zu definieren, während die IsTabStop-Eigenschaft WPF zwingt, ein Control zu überspringen, wenn der Benutzer durch das Fenster navigiert. Hier ist das Markup, mit dem der Dialog erstellt wurde:
<Window x:Class="WpfTutorialSamples.Control_concepts.TabOrderSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTutorialSamples.Control_concepts"
mc:Ignorable="d"
Title="TabOrderSample" Height="250" Width="400">
<Grid Margin="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="20" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel>
<Label>First name:</Label>
<TextBox TabIndex="0" />
<Label>Street name:</Label>
<TextBox TabIndex="2" />
<Label>City:</Label>
<TextBox TabIndex="5" IsReadOnly="True" IsTabStop="False" Background="Gainsboro" />
</StackPanel>
<StackPanel Grid.Column="2">
<Label>Last name:</Label>
<TextBox TabIndex="1" />
<Label>Zip Code:</Label>
<TextBox TabIndex="4" />
</StackPanel>
<Button Grid.Row="1" HorizontalAlignment="Right" Width="80">Add</Button>
<Button Grid.Row="1" Grid.Column="2" HorizontalAlignment="Left" Width="80">Cancel</Button>
</Grid>
</Window>
Beachten Sie, dass ich jedem relevanten Control einfach eine Nummer in der TabIndex-Eigenschaft gebe und dann dieIsTabStop-Eigenschaft für die "City"-TextBox auf "False" setze - so einfach ist es, die Tabulatorfolge in einem Dialog zu steuern!
Zusammenfassung
Die Kontrolle der Tabulatorfolge eines Dialogs ist sehr wichtig, aber gottseidank ist WPF sehr gut darin, eine sinnvolle Tabulatorfolge automatisch festzulegen. In einigen Fällen ist es jedoch sinnvoll, in die Automatik einzugreifen und über die Eigenschaften TabIndex und IsTabStop zu beeinflussen, wie im obigen Beispiel gezeigt.