2010-12-28 8 views
43

Estoy usando un DataGrid en el modo de selección de fila (es decir, SelectionUnit="FullRow"). Simplemente quiero quitar el borde que se está colocando alrededor de la celda actual cuando el usuario resalta una fila para tener una verdadera selección de fila completa (y no hay una selección de nivel de celda). No me importa la idea de que la cuadrícula mantenga la celda actual, solo quiero quitar ese molesto límite de celda actual, quizás cambiando el estilo de la celda actual. ¿Cuál es la forma más fácil de hacer esto?Deshabilitar el límite de celda actual de DataGrid en el modo de selección FullRow

Respuesta

88

Se podría establecer el BorderThickness para DataGridCell a 0

<DataGrid ... 
      SelectionUnit="FullRow"> 
    <DataGrid.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="BorderThickness" Value="0"/> 
      <!-- Update from comments. 
       Remove the focus indication for the selected cell --> 
      <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
     </Style> 
    </DataGrid.CellStyle> 
    <!-- ... --> 
</DataGrid> 
+1

Esto no funciona si el usuario usa las teclas de flecha. El borde de selección de líneas punteadas aún aparece en las celdas. –

+14

@Michael Yanni: Estás hablando del 'FocusVisualStyle'. Para deshabilitarlo, establézcalo como nulo en 'CellStyle' como' ' –

+0

¿Cómo puedo recuperar el espacio faltante de las celdas con el borde establecido a 0? – ygoe

6
<Style x:Key="DataGrid" TargetType="DataGrid"> 
    <Setter Property="CellStyle"> 
     <Setter.Value> 
      <Style TargetType="DataGridCell"> 
       <Setter Property="BorderThickness" Value="0"/> 
       <Setter Property="Foreground" Value="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}" /> 
       <Setter Property="Background" Value="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}" /> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Agregar esas dos líneas ayuda a mantener el estilo aplicado por ResourceDictionary, gracias @marius. – Rachel

0

Si desea mostrar una frontera sólo cuando la célula es editable y seleccionado puede anular la plantilla DataGridCell y añadir un MultiTrigger para cuando la celda IsSelected y no IsReadOnly. Entonces hay frontera se mostrará para las células si se establece IsReadOnly = true para la columna o DataGrid

<ControlTemplate x:Key="MellowDataGridCellTemplate" TargetType="{x:Type DataGridCell}"> 
    <Grid> 
     <ContentPresenter VerticalAlignment="Center" /> 
     <Rectangle Name="FocusVisual" Stroke="White" StrokeThickness="1" Fill="Transparent" HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" /> 

    </Grid> 
    <ControlTemplate.Triggers> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsReadOnly" Value="False" /> 
       <Condition Property="IsSelected" Value="True" /> 
      </MultiTrigger.Conditions> 
      <Setter TargetName="FocusVisual" Property="Opacity" Value="1"/> 
     </MultiTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Utilice la plantilla en un estilo

<Style TargetType="{x:Type DataGridCell}" x:Key="MellowGridDataGridCell"> 
    <Setter Property="Template" Value="{StaticResource MellowDataGridCellTemplate}" /> 
</Style> 

y utilizar el estilo

<DataGrid CellStyle={StaticResource MellowGridDataGridCell > 
    ... 
</DataGrid> 
0

Si está utilizando el xceedDataGridControl, configure el NavigationBehavior en RowOnly

<xcdg:DataGridControl NavigationBehavior="RowOnly" SelectionMode="Single" .... 
7

Vimos otra respuesta aquí que estaba cerca, pero no eliminó el rectángulo del foco. A continuación se explica cómo borrar todas las fronteras.

<DataGrid.Resources> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="BorderThickness" Value="0" /> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
    </Style> 
</DataGrid.Resources> 

Además, dado que técnicamente esas células todavía lo hacen obtener el foco (que simplemente no lo ve), para hacer el avance tecla de tabulación para la siguiente fila en lugar de la siguiente celda, que definen un estilo de celda basado en lo anterior pero que también añade lo siguiente ...

<DataGrid.Resources> 
    <Style x:Key="NoFocusDataGridCell" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}"> 
     <Setter Property="Focusable"  Value="False" /> 
     <Setter Property="IsTabStop"  Value="False" /> 
     <Setter Property="IsHitTestVisible" Value="False" /> 
    </Style> 
</DataGrid.Resources> 

... luego me aplico a todos, pero la primera definición de columna. De esa forma, la tecla de tabulación avanza a la siguiente fila, no a la siguiente celda.

Sin embargo, vuelve a los bordes. Si desea ocultar ellos, pero todavía quiere que sean parte de la disposición de espaciado de razones, cambian lo anterior a este ...

<DataGrid.Resources> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="BorderBrush" Value="Transparent" /> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
    </Style> 
</DataGrid.Resources> 

disfrutar! :)

+0

Esto está aún más cerca pero hay una advertencia: si hace clic en la columna 0 obtiene el pincel de selección de selección activa (como se esperaba), pero al hacer clic en la columna 1+ obtiene el pincel de selección inactiva (inesperado). El pincel inactivo se pega (haciendo clic en otras filas) hasta que haga clic en la columna 0. Entonces, el pincel activo se pega hasta que DataGrid pierde el foco. –

+0

Interesante. No estaba viendo eso antes, pero definitivamente voy a intentarlo ahora. La razón por la que estaba agregando eso sin embargo fue para arreglar el orden de las pestañas. Dicho esto, tal vez la solución sea tan simple como cambiarla de forable = false a istabstop = false. Debería lograr lo mismo. – MarqueIV

+0

Acabo de probar el ajuste 'IsTabStop =" False "' y parece que cubre todos los casos. Técnicamente, la celda que no es de la primera columna recibe el foco al hacer clic y la flecha hacia la izquierda/derecha para cambiar el foco a otras celdas pero la tabulación va a la primera celda de la siguiente fila o al siguiente control (si se enfoca una de las celdas de la última fila) . Sin embargo, dudo que sea un problema. Tal vez para lectores de pantalla? ¡Gracias de todos modos! –

Cuestiones relacionadas