2011-10-10 107 views
4

爲什麼我的XAML不在我指定的TabOrder之後?未遵循指定的製表順序?

我目前有:

<DockPanel> 
    <Grid DockPanel.Dock="Top"> 
     <UserControl TabIndex="0"> 
      <StackPanel Orientation="Horizontal"> 
       <ComboBox /> 
       <TextBox Text="Search Text" /> 
       <Button Content="Search" /> 
      </StackPanel> 
     </UserControl> 
     <ComboBox TabIndex="1" /> 
     <Separator /> 
     <TextBox TabIndex="3" Text="Save" /> 
     <TextBox TabIndex="4" Text="Cancel" /> 
    </Grid> 
    <Grid> 
     <ContentControl TabIndex="2" /> 
     <Popup /> 
    </Grid> 
</DockPanel> 

enter image description here

我的TabOrder應該去

  • 搜索的ComboBox
  • 搜索文本
  • 搜索按鈕
  • 數據庫組合框
  • ContentControl中
  • 保存按鈕
  • 取消按鈕

但是,相反它會

  • 搜索的ComboBox
  • 搜索文本
  • 搜索按鈕
  • ContentControl中
  • 數據庫組合框
  • 保存按鈕
  • 取消按鈕

我有什麼毛病我的TabOrder?

編輯

我發現this SO answer這表明製作UserControl.IsTabStop="False",並綁定的子控件的TabIndex到UserControl.TabIndex,這部分工作。

我的TabOrder現在

  • 搜索的ComboBox
  • 搜索文本
  • 搜索按鈕
  • 數據庫組合框
  • 保存按鈕
  • 取消按鈕
  • ContentControl中

回答

2

顯然在默認情況下,WPF讀取所有的控制,內部和外部用戶控件,在同一標籤的水平(除非另有規定)。由於UserControl內部的控件沒有指定TabIndex,因此它們會在第一個製表符週期後得到選項卡。

的解決方法是內部控制的TabIndex綁定到用戶控件

<DockPanel Margin="10" KeyboardNavigation.TabNavigation="Cycle"> 
    <Grid DockPanel.Dock="Top" 
      local:GridProperties.ColumnCount="6" 
      local:GridProperties.StarColumns="0"> 

     <TextBlock Text="Header" FontSize="20" FontWeight="Bold" /> 
     <ContentControl Grid.Column="1" TabIndex="0" IsTabStop="False" Content="{Binding SearchViewModel}" /> 

     <ComboBox Grid.Column="2" Margin="5" Width="100" /> 

     <Separator Grid.Column="3" Style="{StaticResource VerticalSeparatorStyle}" /> 

     <Button Grid.Column="4" TabIndex="3" Content="Save" Width="75" Margin="5" /> 
     <Button Grid.Column="5" TabIndex="4" Content="Cancel" Width="75" Margin="5" /> 
    </Grid> 

    <Line HorizontalAlignment="Stretch" X2="1" Stretch="Fill" Stroke="Black" StrokeThickness="1" Margin="0,5" DockPanel.Dock="Top" /> 

    <Grid x:Name="ShellContentRoot"> 

     <!-- Current Page --> 
     <ContentControl TabIndex="2" Content="{Binding CurrentAccount}" IsTabStop="False" /> 

     <!-- Search Results --> 
     <local:PopupPanel local:PopupPanel.PopupParent="{Binding ElementName=ShellContentRoot}" /> 
    </Grid> 
</DockPanel> 

特別之處我SearchView唯一的TabIndex就是控制所有的設置

TabIndex="{Binding Path=TabIndex, RelativeSource={RelativeSource 
    AncestorType={x:Type local:SearchView}}}" 

Tab順序去:

  • UserControl Se拱組合框
  • 用戶控件搜索文本
  • 用戶控件搜索按鈕
  • 數據庫組合框
  • ContentControl中
  • 保存按鈕
  • 取消按鈕
0

嘗試在您的父級DockPanel中包含KeyboardNavigation.TabNavigation =「Local」。

<DockPanel KeyboardNavigation.TabNavigation="Local"> 

KeyboardNavigationMode

+0

不會改變任何東西 – Rachel

+0

我不想地方Tab導航雖然...我想第一個網格有TabIndex 0,1,3,4,第二個網格有TabIndex 2 – Rachel

0

這個工作對我來說:

<DockPanel > 
    <DockPanel DockPanel.Dock="Top"> 
     <UserControl TabIndex="0" KeyboardNavigation.TabNavigation="Local" DockPanel.Dock="Left"> 
      <StackPanel Orientation="Horizontal"> 
       <ComboBox /> 
       <TextBox Text="Search Text" /> 
       <Button Content="Search" /> 
      </StackPanel> 
     </UserControl> 
     <ComboBox TabIndex="1" DockPanel.Dock="Left" /> 
     <Separator /> 
     <TextBox TabIndex="3" Text="Save" DockPanel.Dock="Left"/> 
     <TextBox TabIndex="4" Text="Cancel" DockPanel.Dock="Left"/> 
    </DockPanel> 
    <Grid DockPanel.Dock="Bottom"> 
      <ContentControl TabIndex="2" Height="100" Width="100"/> 
      <Popup /> 
    </Grid> 
</DockPanel> 
+0

我不想要本地鍵盤導航,但我的UserControl內。我希望它循環 – Rachel