2010-01-21 10 views
13

Tengo una cuadrícula de datos de WPF Toolkit con varias columnas. Estoy tratando de obtener un comportamiento en el que puedas tabular en la cuadrícula usando la pestaña y luego tabular de nuevo usando una sola pestaña. P.ej. No quiero tabular todas las columnas o celdas de la grilla, solo una vez, y una vez fuera.Desactivar tabstop entre columnas en una cuadrícula de datos WPF

Existe una solución simple, he intentado configurar TabNavigation a Once, junto con deshabilitar TabStop (no se muestra en el código a continuación) y configurar TabNavigation en las columnas a None, pero sin éxito.

¿Hay algo que me falta o necesito manejar la tecla Tab en el código?

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

http://stackoverflow.com/questions/858938/wpf-toolkit-datagrid-custom-tabbing/1707920#1707920 – Bermo

Respuesta

17

Es interesante que la fijación de la KeyboardNavigation directamente en la DataGridTextColumn de no funciona. Una alternativa que debería funcionar es configurar un estilo 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> 

La conexión de este a la cuadrícula de datos se asegurará de que una célula es sólo una PuntoDeTabulación si ya está seleccionado. Sin embargo, si está seleccionando filas completas y no tiene SelectionUnit = "Cell" configurada en el DataGrid, seguirá desplazándose por cada columna de la fila seleccionada actualmente.

En cambio, podemos crear múltiples CellStyles como recursos dentro de la cuadrícula de datos:

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

Ahora tenemos un estilo que se aplica a todos los DataGridCells por defecto y apagar PuntoDeTabulación, y un estilo con llave que permite la selección cuando el Se selecciona Celda (o Fila completa). La aplicación de este estilo solo a una columna nos dará el mismo efecto de entrada de una sola pestaña, al tiempo que permite seleccionar toda la fila y todas sus columnas.

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

Esto también deja de tabulación en la cuadrícula de datos, si no hay nada seleccionado, que puede ser preferible o no dependiendo de la situación que está utilizando en.

10

Gracias rmoore. Para que se deshabilitara la tabulación para las columnas, tomé su respuesta y la modifiqué un poco;

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

So tricks;

  1. SelectionUnit = "FullRow" hace que el GUI como usted está haciendo las cosas de una fila a la vez (como quería).
  2. Al agregar un CellStyle a las columnas en las que quiero deshabilitar TabStop (pero no incluirlo en aquellas en las que quisiera detenerme) me permitió tomar el control de las celdas a las que accedería esa tecla de tabulación. - KeyboardNavigation.TabNavigation no tiene un efecto cuando está definido en columnas.
Cuestiones relacionadas