2014-01-28 99 views
5

我有一種情況,我試圖爲動態加載的控件設置Tab順序(tabindex)。主要的XAML看起來是這樣的:動態加載控件的Tab順序

<ItemsControl DockPanel.Dock="Top" ItemsSource="{Binding ItemsDataSource}" Name="overlayItems" ItemTemplate="{StaticResource DetailsTemplate}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Vertical"/> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

例如,假定該DetailsTemplate是簡單的東西是這樣的:

<DataTemplate x:Key="DetailsTemplate"> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="50" /> 
     <ColumnDefinition Width="150" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="22" /> 
     <RowDefinition Height="22" /> 
     <RowDefinition Height="22" /> 
    </Grid.RowDefinitions> 

    <Label Grid.Column="0" Grid.Row="0" Padding="0">Field 1</Label> 
    <TextBox Grid.Column="1" Grid.Row="0" Name="field1TextBox" TabIndex="0" Text="{Binding Field1Value}"/> 

    <Label Grid.Column="0" Grid.Row="1" Padding="0">Field 2</Label> 
    <TextBox Grid.Column="1" Grid.Row="1" Name="field2TextBox" TabIndex="1" Text="{Binding Field2Value}"/> 

    <Label Grid.Column="0" Grid.Row="2" Padding="0">Field 3</Label> 
    <TextBox Grid.Column="1" Grid.Row="2" Name="field3TextBox" TabIndex="2" Text="{Binding Field3Value}"/> 
    </Grid> 
</DataTemplate> 

這XAML的作品除了導致Tab順序就好了。

假設ItemsDataSource是一個類的集合並且包含該類的3個實例,則會創建三組DetailsTemplate數據模板。然而,tab的順序並沒有改變,每個field1TextBox仍然保留在TabIndex 0上。這意味着,不是從field1TextBox的第一個實例到field2TextBox到field3TextBox,而是從field1TextBox的第一個實例到field1TextBox的第二個實例到field1TextBox的第三個實例,然後到field2TextBox的第一個實例,依此類推。我的問題是,如何在數據模板的第二個實例將其文本框標籤索引分別更新爲3,4和5的情況下如何獲取Tab鍵順序?

回答

4

您可以在MSDN的KeyboardNavigation.TabNavigation Attached Property頁面找到答案。此屬性獲取或設置此屬性在上設置的元素的子元素的邏輯選項卡導航行爲。

有在使用的以不同方式影響跳位順序的KeyboardNavigationMode Enumeration幾種可能的值,但你Local價值,它具有標籤指數被認爲是本地子樹僅此容器和內後的效果是。 .. [到達邊緣時,導航離開容納元素]

<Grid KeyboardNavigation.TabNavigation="Local"> 
    ... 
</Grid> 
+0

謝謝謝里登。我會檢查一下。 –

+0

我想證實這確實適用於我的解決方案。再次感謝! –