2016-06-17 6 views
0

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?

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.

+0

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