2017-06-29 4 views
0

ich eine WPF-Steuerelement haben wie folgt definiert:WPF: Der Übergang von einer Zelle zur nächsten, wenn sie in einem Items Drücken der Eingabetaste

 <ItemsControl ItemsSource="{Binding DutyValueBinders}" IsEnabled="{Binding Enabled}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <TextBox Text="{Binding Value, TargetNullValue=''}" Width="50"></TextBox> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

Dies erzeugt ein Gitter, wie folgt aussehen:

Grid with data

Obwohl im XAML nur ein Textfeld definiert ist, sieht der Benutzer ein Raster.

Was ich tun möchte, ist, nachdem der Benutzer einen Wert eingegeben und Enter oder Return gedrückt hat, sollte der Fokus an die nächste Zelle weitergeleitet werden usw., bis das Ende des Rasters erreicht ist. Ich habe versucht, diese Routine in den hinter Code setzen (von einem anderen Thread auf Stackoverflow kopiert):

private void UserControl_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key != Key.Enter || (!e.IsToggled && sender is Button)) return; 
     var request = new TraversalRequest(FocusNavigationDirection.Next); 
     var keyboardFocus = Keyboard.FocusedElement as UIElement; 

     if (keyboardFocus == null) return; 
     keyboardFocus.MoveFocus(request); 
     e.Handled = true; 
    } 

und den Header der XAML wie folgt geändert:

<UserControl ... 
      (Other references) 
      ... 
      d:DesignHeight="300" d:DesignWidth="300" PreviewKeyDown="UserControl_PreviewKeyDown"> 

Das Problem ist, da es nur ist eine Textbox in der XAML-Definition, es gibt keine Tabindex-Reihenfolge für sie zu folgen, und wenn Sie also die Eingabetaste drücken, verschwindet der Cursor einfach.

Gibt es eine Möglichkeit, dies zu tun, kurz, den XAML vollständig zu verwerfen und wieder mit einer anderen Art von Steuerelement zu beginnen?

+0

Ich verstehe nicht, wie das 'ItemsControl' mehrere Zeilen produzieren kann. – Maxim

Antwort

1

Wie wäre das PreviewKeyDown Ereignis für die ItemsControl wie diese Handhabung ?:

<ItemsControl ItemsSource="{Binding DutyValueBinders}" IsEnabled="{Binding Enabled}" 
       PreviewKeyDown="ItemsControl_PreviewKeyDown"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Value, TargetNullValue=''}" Width="50"></TextBox> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

private void ItemsControl_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
     TextBox textBox = Keyboard.FocusedElement as TextBox; 
     if (textBox != null) 
     { 
      textBox.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
     } 
    } 
} 
Verwandte Themen