Question

J'ai une boîte à outils WPF DataGrid avec des colonnes mulitple. Je suis en train d'obtenir un comportement où vous pouvez onglet dans la grille à l'aide onglet, puis sur l'onglet à l'aide à nouveau un seul onglet. Par exemple. Je ne veux pas naviguer à travers toutes les colonnes ou les cellules de la grille, juste une fois et, une fois dehors.

Y at-il une solution simple, j'ai essayé de placer le TabNavigation à jour, ainsi que la désactivation TabStop (non représenté dans le code ci-dessous) et la mise en TabNavigation sur les colonnes à None, mais sans succès.

Y at-il quelque chose que je suis absent ou dois-je gérer l'onglet clé dans le code?

        <my:DataGrid Name="datagrid"
                     AutoGenerateColumns="False" IsReadOnly="True"
                     CanUserAddRows="False" CanUserDeleteRows="False"
                     Background="White"
                     KeyboardNavigation.TabNavigation="Once">
            <my:DataGrid.Columns>
                <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" ></my:DataGridTextColumn>
                <my:DataGridTextColumn x:Name="Ticker" Header="Ticker" Width="1*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn>
                <my:DataGridTextColumn x:Name="OfficialName" Header="Name" Width="3*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn>
            </my:DataGrid.Columns>
        </my:DataGrid>
Était-ce utile?

La solution

Il est intéressant de noter que le réglage de la KeyboardNavigation directement sur la DataGridTextColumn de ne fonctionne pas. Une alternative qui devrait fonctionner est de mettre en place un style DataGridCell.

<toolkit:DataGrid.CellStyle>
    <Style TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="KeyboardNavigation.IsTabStop"
                Value="False" />
        <Style.Triggers>
            <Trigger Property="IsSelected"
                     Value="True">
                <Setter Property="KeyboardNavigation.IsTabStop"
                        Value="True" />
            </Trigger>
        </Style.Triggers>
    </Style>
</toolkit:DataGrid.CellStyle>

Fixation cela au DataGrid veillera à ce qu'une cellule est seulement ArrêtTabulation si elle est déjà sélectionnée. Toutefois, si vous sélectionnez les lignes complètes et n'ont pas SelectionUnit = « Cell » situé sur la grille de données, il fera un cycle encore à travers chaque colonne de la ligne sélectionnée.

Au lieu de cela, nous pouvons créer plusieurs CellStyles comme ressources dans le DataGrid:

<toolkit:DataGrid.Resources>

    <Style  x:Key="SelectableCellStyle"
            TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="KeyboardNavigation.IsTabStop"
                Value="False" />
        <Style.Triggers>
            <Trigger Property="IsSelected"
                     Value="True">
                <Setter Property="KeyboardNavigation.IsTabStop"
                        Value="True" />
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="KeyboardNavigation.IsTabStop"
                Value="False" />
    </Style>

</toolkit:DataGrid.Resources>

Maintenant, nous avons un style appliqué à tous DataGridCells par défaut et éteindre ArrêtTabulation, et un style qui permet la sélection à clé lorsque la cellule (ou ligne entière) est sélectionné. L'application de ce style à une seule colonne nous donnera la même un seul onglet en effet, tout en permettant toute la ligne et l'ensemble de ses colonnes à sélectionner.

 <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" CellStyle={StaticResource  SelectableCellStyle}"/>

Cela ne s'arrête aussi dans le DataGrid tabulant si rien est sélectionné, ce qui peut être préférée ou non en fonction de la situation que vous utilisez dans.

Autres conseils

Merci rmoore. Pour obtenir l'arrêt de tabulation pour être désactivé pour les colonnes, je pris votre réponse et légèrement modifié;

     <my:DataGrid Name="datagrid" 
                 AutoGenerateColumns="False" IsReadOnly="True" 
                 CanUserAddRows="False" CanUserDeleteRows="False" 
                 Background="White" 
                 KeyboardNavigation.TabNavigation="Once"
                 SelectionUnit="FullRow"> 
        <my:DataGrid.Columns> 
            <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" ></my:DataGridTextColumn> 
            <my:DataGridTextColumn x:Name="Ticker" Header="Ticker" Width="1*">
                    <my:DataGridTextColumn.CellStyle>
                        <Style TargetType="{x:Type my:DataGridCell}">
                            <Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter>
                        </Style>
                    </my:DataGridTextColumn.CellStyle>
            </my:DataGridTextColumn> 

            <my:DataGridTextColumn x:Name="OfficialName" Header="Name" Width="3*">
                  <my:DataGridTextColumn.CellStyle>
                        <Style TargetType="{x:Type my:DataGridCell}">
                            <Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter>
                        </Style>
                  </my:DataGridTextColumn.CellStyle>
            </my:DataGridTextColumn> 
        </my:DataGrid.Columns> 
    </my:DataGrid>

tours;

  1. SelectionUnit = « FullRow » fait l'aspect graphique comme vous faites les choses d'une ligne à la fois (comme je voulais).
  2. En ajoutant un CellStyle aux colonnes que je veux désactiver TabStop dans (mais pas y compris dans ceux que je voudrais arrêter) m'a permis de prendre le contrôle sur laquelle les cellules que l'onglet clé naviguerait dans. -. Le KeyboardNavigation.TabNavigation ne pas avoir un effet lorsqu'elle est définie sur les colonnes

Je sais que c'est une question très ancienne, mais je poste ce ici au cas où il aide quelqu'un. Alors que la réponse acceptée est bonne, je ne crois pas qu'il couvre le cas où il y a un autre contrôle sur la même fenêtre, et que vous souhaitez onglet dans la DataGrid de ce contrôle. De plus, vous voudrez peut-être le comportement comme décrit dans la question initiale (onglet unique, onglet singulariser, pas par les cellules / tabbing colonnes). Cette solution vise à atteindre cet objectif.

Remarque: Cette solution est en supposant que vous voulez que votre SelectionUnit à FullRow dans votre DataGrid

.

Tout d'abord, voici le Style à appliquer à la DataGrid:

<DataGrid.Resources>
    <Style TargetType="DataGridRow">
        <Style.Setters>
            <Setter Property="Focusable" Value="True"/>
        </Style.Setters>
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="True">
                <Setter Property="IsSelected" Value="True"/>
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style TargetType="DataGridCell">
        <Style.Setters>
            <Setter Property="Focusable" Value="False"/>
        </Style.Setters>
    </Style>
</DataGrid.Resources>

Ce style permet de se concentrer sur les lignes, mais empêche l'accent sur des cellules individuelles, ce qui maintient la mise au point en accord avec la SelectionUnit de FullRow. Le déclencheur mis dans ce style est optionnel -. Il est nécessaire que si vous voulez sélectionner automatiquement la ligne lorsqu'il reçoit le focus

Dans mon cas, je voulais l'onglet unique / onglet sur le comportement, donc je mets également la propriété KeyboardNavigation.TabNavigation sur mon DataGrid = « Une fois ».

<DataGrid SelectionUnit="FullRow" KeyboardNavigation.TabNavigation="Once">

Avec cette approche, je peux toujours utiliser les touches haut / bas flèche pour faire défiler les lignes une fois que la DataGrid reçoit le focus, mais je ne peux onglet encore rapidement si je veux déplacer le focus sur le contrôle suivant dans l'ordre de tabulation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top