Как получить выбранный элемент списка в событии DragOver - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть два списка при перетаскивании одного элемента из исходного списка. Я хочу, чтобы целевой список выбирал элемент на основе позиции мыши над списком. Я реализовал это, но событие MouseOver срабатывает только тогда, когда вы не перетаскиваете. Как выбрать элемент на основе изобретения перетаскивания из списка.

Вот код

 Private Sub CasesBox2_DragEnter(sender As Object, e As System.Windows.DragEventArgs) Handles CasesBox2.DragEnter
    CasesBox2.CaptureMouse()
    If Not e.Data.GetDataPresent("contact") OrElse sender = e.Source Then
        e.Effects = DragDropEffects.None


    Else
        e.Effects = DragDropEffects.All
    End If


End Sub

Private Sub CasesBox2_DragOver(sender As Object, e As System.Windows.DragEventArgs) Handles CasesBox2.DragOver

    Dim MousePoint As Windows.Point = e.GetPosition(Nothing)

End Sub

Private Sub CasesBox2_Drop(sender As Object, e As System.Windows.DragEventArgs) Handles CasesBox2.Drop

    If e.Data.GetDataPresent("myFormat") Then
        Dim contact As Details = TryCast(e.Data.GetData("myFormat"), Details)
        Dim cse As Cases = CasesBox2.SelectedItem
        If cse IsNot Nothing Then
            Dim cs2 As ObservableCollection(Of Details) = DtlBox3.ItemsSource
            cs2.Remove(contact)
            cse.AddDetailsToCase(contact)
            IsDragInitiated = False
        End If
        IsDragInitiated = False
    End If
    IsDragInitiated = False

End Sub


Private Sub CasesBox2_SelectionChanged(sender As Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles CasesBox2.SelectionChanged
    Try
        If IsDragInitiated Then

        Else
            Dim SelectedItem As Cases = CasesBox2.SelectedItem
            DtlBox3.ItemsSource = SelectedItem.CaseDetails
        End If



    Catch ex As Exception

    End Try

End Sub

Private Sub DtlBox3_MouseMove(sender As Object, e As System.Windows.Input.MouseEventArgs) Handles DtlBox3.MouseMove
    Try
        ' Get the current mouse position
        Dim mousePos As Windows.Point = e.GetPosition(Nothing)
        Dim diff As Vector = StartPoint - mousePos

        If e.LeftButton = MouseButtonState.Pressed AndAlso Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance OrElse Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance Then
            ' Get the dragged ListViewItem
            Dim listView As ListBox = TryCast(sender, ListBox)
            Dim listViewItem As ListBoxItem = FindAnchestor(Of ListBoxItem)(DirectCast(e.OriginalSource, DependencyObject))

            ' Find the data behind the ListViewItem
            Dim contact As Details = DirectCast(listView.ItemContainerGenerator.ItemFromContainer(listViewItem), Details)

            ' Initialize the drag & drop operation
            Dim dragData As New DataObject("myFormat", contact)
            IsDragInitiated = True
            DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Move)


        End If
    Catch ex As Exception

    End Try


End Sub

' Helper to search up the VisualTree
Private Shared Function FindAnchestor(Of T As DependencyObject)(current As DependencyObject) As T
    Do
        If TypeOf current Is T Then
            Return DirectCast(current, T)
        End If
        current = VisualTreeHelper.GetParent(current)
    Loop While current IsNot Nothing
    Return Nothing
End Function

Private Sub DtlBox3_PreviewMouseLeftButtonDown(sender As Object, e As System.Windows.Input.MouseButtonEventArgs) Handles DtlBox3.PreviewMouseLeftButtonDown
    StartPoint = e.GetPosition(Nothing)
End Sub

Private Sub Border_MouseEnter(sender As System.Object, e As System.Windows.Input.MouseEventArgs)
    CasesBox2.SelectedItem = CType(sender, Border).DataContext
    If CasesBox2.IsFocused Then
    Else
        CasesBox2.Focus()
    End If
End Sub

1 Ответ

1 голос
/ 07 апреля 2011

Похоже, вы пытаетесь выполнить горячее отслеживание с помощью DragOver для отдельных элементов списка.

Если вы используете WPF, вы, вероятно, могли бы создать собственный шаблон для ListBoxItems, для которого есть триггер.

Если нет: вы можете реализовать DragOver в самих элементах списка, а не только в элементе управления ListBox, и вам потребуется сохранить ссылку на текущий отслеживаемый элемент, чтобы вы могли отменить его выделение.Это означает, что ваш ListBox должен быть заполнен некоторыми пользовательскими объектами.

...