Pregunta

Tengo una cuadrícula de datos WPF Toolkit con columnas haya numerosas. Estoy tratando de conseguir un comportamiento donde se puede pestaña en la red mediante la ficha, a continuación, la pestaña de nuevo utilizando una sola pestaña. P.ej. No quiero para desplazarse por todas las columnas o celdas de la cuadrícula, sólo una vez, y una vez fuera.

¿Hay una solución simple, He intentado fijar la TabNavigation a vez, junto con la desactivación PuntoDeTabulación (no se muestra en el código de abajo) y el establecimiento de TabNavigation en las columnas a ninguno, pero sin éxito.

¿Hay algo que me falta o necesito para 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>
¿Fue útil?

Solución

No es interesante que la fijación de la KeyboardNavigation directamente en la DataGridTextColumn de sí funciona. Una alternativa que se debe trabajar es la creación de 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 va a seleccionar filas completas y no tienen SelectionUnit = conjunto "celda" en la cuadrícula de datos, éste seguirá desplazarse por cada columna de la fila seleccionada en ese momento.

En su lugar, 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 se selecciona la célula (o fila entera). La aplicación de este estilo para una única columna nos dará el mismo solo por tabuladores, en efecto, al tiempo que permite la fila entera y todo ello de columnas para ser seleccionados.

 <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 preferirse o no dependiendo de la situación que se esté utilizando,.

Otros consejos

Gracias rmoore. Para obtener la tabulación que sea deshabilitada para columnas Tomé su respuesta y lo modificó ligeramente;

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

Así trucos;

  1. SelectionUnit = "FullRow" hace que el GUI como usted está haciendo las cosas de una fila a la vez (como quería).
  2. Al añadir un CellStyle a las columnas que desea desactivar en PuntoDeTabulación (pero sin incluir en los quisiera parar en) me permitió tomar el control sobre el cual las células que tabuladores clave sería navegar dentro. -. El KeyboardNavigation.TabNavigation no tener un efecto cuando se define en columnas

Yo sé que esto es una pregunta muy viejo, pero Quiero poner esta aquí en caso de que ayuda a alguien. Mientras que la respuesta aceptada es bueno, no creo que cubre el caso en el que no hay otro control en la misma ventana, y que le gustaría a la pestaña en el DataGrid de ese control. Además, es posible que desee el comportamiento tal como se describe en la pregunta original (ficha individual en, sola pestaña a cabo, sin tabulación a través de células / columnas). Esta solución tiene como objetivo lograr esto.

Nota:. Esta solución es suponiendo que usted quiere que su SelectionUnit sea FullRow en su DataGrid

En primer lugar, aquí es el Style para aplicar a 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>

Este estilo permite centrarse en filas, pero impide que se centran en las células individuales, lo que mantiene el enfoque consistente con la SelectionUnit de FullRow. El conjunto de gatillo interior de este estilo es opcional -. Que sólo es necesario si desea seleccionar automáticamente la fila cuando se recibe el foco

En mi caso, yo quería la pestaña individual en / pestaña a cabo la conducta, por lo que también establece la propiedad KeyboardNavigation.TabNavigation en mi DataGrid = "Una vez".

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

Con este enfoque, todavía puedo usar las flechas arriba / abajo teclas de flecha para desplazarse por las filas una vez que el DataGrid recibe el foco, pero puedo todavía pestaña rápidamente si quiero mover el foco al siguiente control en el orden de tabulación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top