La respuesta de Andre tiene un pequeño error, ya que las coordenadas obtenidas no tienen en cuenta los encabezados de fila y columna en el DataGrid. Al menos este fue el caso cuando implementé la solución en Visual Basic.
También puede modificar los ejemplos que se muestran para dar cuenta de un DataGrid grande. Me parece que la limitación no se basa en la idea de desplazado, por lo muestro dos implementaciones de esta corrección:
Private Sub myGrid_MouseMove(sender As Object, e As MouseEventArgs) Handles myGrid.MouseMove
Dim total As Double
Dim myScrollViewer As ScrollViewer = FindVisualChild(Of ScrollViewer)(myGrid)
Dim cursorPositionX = e.GetPosition(myGrid).X
Dim columnIndex As Integer = -1
total = 0
'Horizontal offset'
Dim rowHeaders As DataGridRowHeader = FindVisualChild(Of DataGridRowHeader)(myGrid)
cursorPositionX -= (rowHeaders.ActualWidth - myScrollViewer.HorizontalOffset)
For Each column As DataGridColumn In myGrid.Columns
If cursorPositionX < total Then Exit For
columnIndex += 1
total += column.Width.DisplayValue
Next
Dim cursorPositionY = e.GetPosition(myGrid).Y
Dim rowIndex As Integer = -1
total = 0
'Vertical offset'
Dim originalOffset As Double = myScrollViewer.VerticalOffset
Dim colHeadersPresenter As DataGridColumnHeadersPresenter = FindVisualChild(Of DataGridColumnHeadersPresenter)(myGrid)
cursorPositionY -= colHeadersPresenter.ActualHeight
For Each row As System.Data.DataRowView In myGrid.Items
If cursorPositionY < total Then Exit For
rowIndex += 1
Dim dgRow As DataGridRow = GetRowByIndex(myGrid, rowIndex)
total += dgRow.ActualHeight
'GetRowByIndex will scroll the view to bring the DataGridRow of interest into view, which throws off the counter. This adjusts for that'
myGrid.UpdateLayout()
If Not myScrollViewer.VerticalOffset = originalOffset Then myGrid.ScrollIntoView(myGrid.Items(CInt(myScrollViewer.ViewportHeight + originalOffset - 1)))
myGrid.UpdateLayout()
If myScrollViewer.VerticalOffset > rowIndex Then cursorPositionY += dgRow.ActualHeight
Next
End Sub
Tenga en cuenta que la ScrollViewer.HorizontalOffset Property devuelve un valor en píxeles independientes del dispositivo, por lo que sólo compensa mi lugar de una vez antes de recorrer las columnas.
Tenga en cuenta que el ScrollViewer.VerticalOffset Property devuelve el número de elementos si CanContentScroll = True. Entonces, en mi ejemplo, en cada ciclo compenso el contador por la altura de un elemento (el DataGridRow). Si CanContentScroll = False, se puede manejar como en el caso del bucle de índice de columna.
no pude encontrar las definiciones de fila en la cuadrícula de datos para .NET 4.0 en Visual Basic, pero la siguiente función de apoyo para la obtención de ayuda a la DataGridRow:
Function GetRowByIndex(ByVal p_dataGrid As DataGrid,
ByVal p_index As Integer) As DataGridRow
Dim row As DataGridRow
row = CType(p_dataGrid.ItemContainerGenerator.ContainerFromIndex(p_index), DataGridRow)
If IsNothing(row) Then
'May be virtualized, bring into view and try again.'
p_dataGrid.UpdateLayout()
p_dataGrid.ScrollIntoView(p_dataGrid.Items(p_index))
row = CType(p_dataGrid.ItemContainerGenerator.ContainerFromIndex(p_index), DataGridRow)
End If
Return row
End Function
Y la función FindVisualChild en Visual Basic:
Function FindVisualChild(Of childItem As DependencyObject)(ByVal p_obj As DependencyObject) As childItem
For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(p_obj) - 1
Dim child As DependencyObject = VisualTreeHelper.GetChild(p_obj, i)
If child IsNot Nothing AndAlso TypeOf child Is childItem Then
Return CType(child, childItem)
Else
Dim childOfChild As childItem = FindVisualChild(Of childItem)(child)
If childOfChild IsNot Nothing Then
Return childOfChild
End If
End If
Next i
Return Nothing
End Function
Mire la funcionalidad de arrastrar/soltar en FluidKit. No tendrás que preocuparte por hacky shnit como este. – Will
Ya estoy usando FluidKit, que 'MouseMove' es realmente 'OnDropCompleted' y la posición del mouse es realmente 'dropPoint' - Quiero poder colocarme en celdas específicas de la tabla, que no he podido obtener trabajando aún – Wilka