ejemplo custom columns wpf wpfdatagrid

custom - wpf datagrid columns



wpf: DataGrid deshabilita los estilos de fila seleccionados, o selección de fila (6)

Veo muchos ejemplos sobre cómo seleccionar las filas seleccionadas en DataGrid como esta:

¿Cómo puedo establecer el color de una fila seleccionada en DataGrid?

¿Puedo desactivar el estilo seleccionado de la fila? No quiero tener que anular cada cosa que seleccionó los cambios de fila. Simplemente no quiero ningún cambio visible. Tengo que ser más fácil que crear plantillas.

o..

deshabilitar la selección de filas, si eso es más fácil ... pero al navegar por este foro, también parece raro

Deshabilitar la selección en WPF DataGrid


Encontré otra manera que funciona bien para mi situación. Establecí este estilo para todas las celdas porque no quiero que el usuario seleccione ninguna celda.

<Style TargetType="{x:Type DataGridCell}"> <Setter Property="IsHitTestVisible" Value="False"/> </Style>


Esto es lo que funcionó para mí:

<DataGrid> <DataGrid.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Property="DataGridCell.IsSelected" Value="True"> <Setter Property="BorderBrush"> <Setter.Value> <SolidColorBrush Color="Transparent"/> </Setter.Value> </Setter> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> <Setter Property="Background"> <Setter.Value> <SolidColorBrush Color="Transparent"/> </Setter.Value> </Setter> </Trigger> </Style.Triggers> </Style> </DataGrid.CellStyle> <!-- ... --> </DataGrid>


Esto es relativamente sencillo:

datagrid.SelectionChanged += (obj, e) => Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => datagrid.UnselectAll()));

Esto desactiva toda la selección en DataGrid.

Si no desea deshabilitar la selección por completo, sino simplemente ocultarla, tendrá que modificar la plantilla.


Para aquellos como yo, que tenemos algunas celdas con diferentes estilos y no queremos anular todos los estilos ni agregar disparadores a cada estilo, esta es una buena apuesta:

<DataGrid.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#333333"/> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Black"/> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="Black"/> </DataGrid.Resources>

HighlightBrushKey es el borde resaltado con la selección activa y HighlightTextBrushKey es el color del texto con la selección activa

En mi caso, quiero que la selección inactiva parezca no seleccionada:

InactiveSelectionHighlightBrushKey es el borde cuando la selección está inactiva e InactiveSelectionHighlightTextBrushKey es el texto cuando la selección está inactiva.

FYI: SystemColors es una clase estática, parte del espacio de nombres System.Windows.Media. ¡Puede inspeccionarlo y descartar descaradamente cualquier color que no le guste!


Primero responderé la segunda pregunta: para desactivar la selección de filas, puede cambiar el RowStyle de su DataGrid.

<DataGrid> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="IsEnabled" Value="False"/> </Style> </DataGrid.RowStyle> <!--Other DataGrid items--> </DataGrid>

Sin embargo, esto cambia el estilo del texto ya que la fila misma está ahora "deshabilitada". Tampoco niega el hecho de que un usuario todavía puede hacer clic derecho en la fila para seleccionarlo. Si realmente deseaba deshabilitar cualquier tipo de interacción con las filas de la cuadrícula de datos, podría hacer lo siguiente:

<DataGrid> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Setter Property="IsHitTestVisible" Value="False"/> </Style> </DataGrid.RowStyle> <!--Other DataGrid items--> </DataGrid>

Como las filas todavía están habilitadas, el estilo del texto no cambia.

Ahora bien, si solo desea cambiar el estilo de la fila seleccionada, pero deje la funcionalidad sola, podría hacer lo siguiente (que es básicamente lo mismo que la respuesta de @ Steve Stevens). ControlTextBrushKey es el pincel que usa el sistema para colorear elementos de texto. Mire esta respuesta para obtener una explicación entre DynamicResource y StaticResource.

<DataGrid> <DataGrid.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Property="DataGridCell.IsSelected" Value="True"> <Setter Property="BorderBrush" Value="Transparent"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> <Setter Property="Background" Value="Transparent"/> </Trigger> </Style.Triggers> </Style> </DataGrid.CellStyle> <!--Other DataGrid items--> </DataGrid>

Es importante tener en cuenta que la solución anterior no cambia el estilo de DataGridRowHeader cuando se selecciona la fila, como se puede ver a continuación (se selecciona la primera fila).


descubrió el XAML para deshacerse del estilo de selección ... no ideal, pero lo suficientemente cerca ...

<Style x:Key="CellStyle" TargetType="{x:Type DataGridCell}"> <Setter Property="Foreground" Value="Black" /> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="{x:Null}" /> <Setter Property="BorderBrush" Value="{x:Null}" /> </Trigger> </Style.Triggers> </Style>