5

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>

ここに画像の説明を入力してください

私のTabOrderは行くべきです

  • ComboBoxを検索
  • テキストを検索
  • 検索ボタン
  • データベースコンボボックス
  • ContentControl
  • 保存ボタン
  • キャンセルボタン

しかし、代わりにそれは行きます

  • ComboBoxを検索
  • テキストを検索
  • 検索ボタン
  • ContentControl
  • データベースコンボボックス
  • 保存ボタン
  • キャンセルボタン

TabOrderの何が問題になっていますか?

編集

を作成し、それを子コントロールのTabIndexにバインドすることを提案するこのSOの回答を見つけました。これは、部分的に機能します。UserControl.IsTabStop="False"UserControl.TabIndex

私のTabOrderは今です

  • ComboBoxを検索
  • テキストを検索
  • 検索ボタン
  • データベースコンボボックス
  • 保存ボタン
  • キャンセルボタン
  • ContentControl
4

3 に答える 3

3

どうやらデフォルトでは、WPFは、UserControlsの内部と外部のすべてのコントロールを、同じタブレベルで読み取ります(特に指定されていない限り)。UserControl内のコントロールにはTabIndexが指定されていないため、最初のタブサイクルの後も最後までタブが付けられます。

TabIndex回避策は、内部コントロールのをTabIndexUserControlのにバインドすることでした。

<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="{Binding Path=TabIndex, RelativeSource={RelativeSource 
    AncestorType={x:Type local:SearchView}}}"

タブの順序は次のとおりです。

  • UserControl Search ComboBox
  • UserControl検索テキスト
  • UserControl検索ボタン
  • データベースコンボボックス
  • ContentControl
  • 保存ボタン
  • キャンセルボタン
于 2011-10-10T16:02:38.500 に答える
0

親のDockPanelにKeyboardNavigation.TabNavigation="Local"を含めてみてください。

<DockPanel KeyboardNavigation.TabNavigation="Local">   

KeyboardNavigationMode

于 2011-10-10T15:30:08.427 に答える
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>
于 2011-10-10T15:51:39.157 に答える