Question Désactiver la tabulation entre les colonnes d'une grille de données WPF


J'ai une grille de données WPF Toolkit avec de multiples colonnes. J'essaie d'obtenir un comportement dans lequel vous pouvez entrer dans la grille en utilisant l'onglet, puis à nouveau à l'aide d'un seul onglet. Par exemple. Je ne veux pas parcourir toutes les colonnes ou cellules de la grille, juste une fois dans et une fois dehors.

Existe-t-il une solution simple, j'ai essayé de définir TabNavigation sur Once, ainsi que de désactiver TabStop (non représenté dans le code ci-dessous) et de définir TabNavigation sur les colonnes sur None, mais sans succès.

Y a-t-il quelque chose qui me manque ou dois-je gérer la touche Tab 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>

13
2018-01-21 17:19


origine


Réponses:


Il est intéressant de noter que la définition directe de KeyboardNavigation sur le DataGridTextColumn ne fonctionne pas. Une alternative qui devrait fonctionner est de configurer 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>

En l'attachant à DataGrid, vous vous assurez qu'une cellule n'est qu'un TabStop si elle est déjà sélectionnée. Toutefois, si vous sélectionnez des lignes complètes et que SelectionUnit = "Cell" n'est pas défini sur le DataGrid, il parcourra toujours chaque colonne de la ligne actuellement sélectionnée.

Au lieu de cela, nous pouvons créer plusieurs CellStyles en tant que 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 les DataGridCells par défaut et en désactivant TabStop, et un style de saisie qui permet la sélection lorsque la cellule (ou une ligne entière) est sélectionnée. Appliquer ce style à une seule colonne nous donnera le même effet de tabulation unique tout en permettant de sélectionner la ligne entière et toutes ses colonnes.

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

Cela arrête également la tabulation dans le DataGrid si rien n'est sélectionné, ce qui peut être préféré ou non selon la situation dans laquelle vous l'utilisez.


17
2018-01-21 19:17



Merci rmoore. Pour que la tabulation soit désactivée pour les colonnes, j'ai pris votre réponse et l'ai modifiée légèrement;

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

Donc des astuces;

  1. SelectionUnit = "FullRow" donne l'impression que vous faites les choses d'une ligne à la fois (comme je le voulais).
  2. En ajoutant un objet CellStyle aux colonnes, je souhaite désactiver TabStop (mais ne pas l'inclure dans celles que je voudrais arrêter), ce qui m'a permis de contrôler les cellules dans lesquelles la touche de tabulation devait naviguer. - Le KeyboardNavigation.TabNavigation n'a pas d'effet lorsqu'il est défini sur des colonnes.

10
2018-01-22 08:57