c# - WPF DataGrid PreviewMouseDown no maneja el clic derecho como se esperaba
mouseevent (2)
Creo que lo que estás viendo es el borde de la celda, que se muestra cuando tiene foco.
Puede eliminarlo estableciendo su grosor en 0 de esta manera:
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="BorderThickness" Value="0" />
</Style>
</DataGrid.CellStyle>
Actualizar:
Aparentemente, cuando configura el evento PreviewMouseDown
para que se maneje, DataGrid solo detiene las selecciones de celdas cuando usa el botón izquierdo del mouse.
También debe manejar PreviewMouseRightButtonUp
para evitar que los clics hacia la derecha seleccionen celdas.
Creo que eso resolvería tu problema?
Tengo un DataGrid configurado con un evento PreviewMouseDown en un Control de usuario. La idea es que cuando un usuario mueve su mouse a una celda, establece una Acción para ejecutar en función del contenido de la celda, y la Acción se ejecutará cuando el usuario haga clic, sin importar qué botón del mouse.
Mi controlador de eventos (C #):
private void LadderMouseClick(object sender, System.Windows.Input.MouseButtonEventArgs e) {
if (m_ActiveAction != null) {
m_ActiveAction();
}
e.Handled = true;
}
Mi DataGrid (XAML):
<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Source={StaticResource sourceCollection}}" Name="DataGrid" RowDetailsVisibilityMode="Collapsed" IsReadOnly="True" Height="600" MouseLeave="DataGrid_MouseLeave" MouseEnter="DataGrid_MouseEnter" PreviewMouseDown="LadderMouseClick" PreviewMouseDoubleClick="LadderMouseDoubleClick" VerticalScrollBarVisibility="Hidden" SelectionUnit="Cell" SelectionMode="Single">
Esto funciona y ejecuta la acción correctamente cuando un usuario hace clic derecho o izquierdo sobre DataGrid. El problema, sin embargo, es que cuando el usuario hace clic derecho, se selecciona la celda en la que se encuentra su mouse (aparece un borde negro alrededor de la celda); esto no ocurre cuando dejaron el clic.
¿Por qué se están comportando de manera diferente? ¿No deberían manejarse de la misma manera? ¿Hay algo realmente simple que me falta?
¡Gracias por adelantado!
EDITAR:
Hasta ahora he intentado con DataGrid.UnselectAll (), DataGrid.UnselectAllCells (), DataGrid.SelectedIndex = -1 y DataGrid.CurrentCell = default (DataGridCellInfo). Ninguno de ellos me ha funcionado.
EDIT # 2:
Si ayuda, estoy utilizando DataGridTemplateColumns con TextBlocks para mostrar mis datos. ¿Podría esto estar causando este comportamiento?
SOLUCIÓN:
Esto fue resuelto por la sugerencia de Peter Hansen , que era agregar un evento PreviewMouseRightButtonDown a DataGrid, así como al evento PreviewMouseDown.
Debería poder llamar al método UnselectAllCells que viene con DataGrids. Simplemente se ve así:
dataGrid.UnselectAllCells();
Llámalo luego de realizar tu acción de clic y debería eliminar la selección de celda.
EDITAR: Creo que su dataGrid.UnselectAllCells () no está invocando porque todavía está en el evento PreviewMouseDown. Intenta hacer un evento PreviewRightMouseButtonUp correspondiente y deselecciona tus celdas allí. El momento en el que invoque este método podría ser crucial para su éxito.