Angenommen, es gibt zwei WPF-Listen. Ich möchte in der Lage sein, nahtlos durch Elemente, die beide Listen mit nur den Pfeiltasten der Tastatur zu iterieren. Standardmäßig ist der Fokusbereich auf die Iteration innerhalb eines einzelnen Containers beschränkt. Gibt es eine Möglichkeit, Containergrenzen zu überschreiten?Wie kann die Tastaturfokus-Traversal-Richtlinie in WPF beeinflusst werden?
0
A
Antwort
0
Habe gerade herausgefunden. KeyboardNavigation.DirectionalNavigation angefügte Eigenschaft macht den Trick. (Mögliche Werte aufgeführt here)
Die Probe kann vereinfacht werden:
<StackPanel KeyboardNavigation.DirectionalNavigation="Contained">
<ListBox KeyboardNavigation.DirectionalNavigation="Continue">
<ListBoxItem Content="Item 1" />
<ListBoxItem Content="Item 2" />
<ListBoxItem Content="Item 3" />
</ListBox>
<ListBox KeyboardNavigation.DirectionalNavigation="Continue">
<ListBoxItem Content="Item A" />
<ListBoxItem Content="Item B" />
<ListBoxItem Content="Item C" />
</ListBox>
</StackPanel>
0
So sagen, es gibt zwei Listviews:
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ListView x:Name="list1" KeyDown="list1_KeyDown">
<ListViewItem Content="item 1"/>
<ListViewItem Content="item 2"/>
<ListViewItem Content="item 3"/>
</ListView>
<ListView x:Name="list2" Grid.Row="1" KeyDown="list2_KeyDown">
<ListViewItem Content="item 1"/>
<ListViewItem Content="item 2"/>
<ListViewItem Content="item 3"/>
</ListView>
</Grid>
Fügen Sie zwei Handler für die KeyDown Ereignisse:
private void list1_KeyDown(object sender, KeyEventArgs e) {
switch (e.Key) {
// check for down key
case Key.Down:
// if the bottom item is selected
if (list1.SelectedIndex == list1.Items.Count - 1) {
// select the next item
list2.SelectedIndex = 0;
(list2.Items[0] as UIElement).Focus();
// make sure nothing else happens
e.Handled = true;
}
break;
}
}
private void list2_KeyDown(object sender, KeyEventArgs e) {
switch (e.Key) {
// check for up key
case Key.Up:
// if the top item is selected
if (list2.SelectedIndex == 0) {
// select the previous item
int i = list1.Items.Count - 1;
list1.SelectedIndex = i;
(list1.Items[i] as UIElement).Focus();
// make sure nothing else happens
e.Handled = true;
}
break;
}
}
Dies ermöglicht eine nahtlosen vertikalen Übergang zwischen den beiden Listviews mit Auf-/Ab-Taste. Sie können weitere Fallblöcke hinzufügen, um zusätzliche Links/Rechts-Übergänge oder was auch immer hinzuzufügen. Ich bin sicher, dass Sie herausfinden können, wie Sie dies an Ihr spezifisches Szenario anpassen können.
Vielen Dank für die Antwort. Dieser Ansatz wird definitiv funktionieren, aber es sieht zu winform-ish aus. Ich hatte gehofft, etwas eleganter zu finden) Ich glaube, es sollte einen besseren Weg in WPF geben. – kane