2017-06-29 54 views
0

我有定義爲WPF控制時從一個小區移動到下一個如下:WPF:按壓輸入一個ItemsControl

 <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> 

這產生的網格,看起來像這樣:

Grid with data

因此,雖然在XAML中只定義了一個文本框,但用戶會看到一個網格。

我想要做的是,在用戶鍵入一個值並按下Enter或Return之後,焦點應該傳遞到下一個單元格,等等,直到到達網格的末端。我試圖把這個程序到後面(從#2另一個線程複製)代碼:

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; 
    } 

和修改的XAML的標題如下:

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

麻煩的是,因爲只有一個在XAML定義中沒有tabindex命令,所以當你按下Enter鍵時,光標就會消失。

有沒有什麼辦法可以做到這一點,完全沒有把XAML全部報廢,並重新開始使用不同類型的控制?

+0

我不明白這是如何'ItemsControl'可以產生多個行。 – Maxim

回答

1

如何處理PreviewKeyDown事件的ItemsControl這樣?:

<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)); 
     } 
    } 
}