如何在DragOver事件中获取列表框选定项目
问题描述:
当我从源列表框中拖动一个项目时我有两个列表框我希望目标列表框选择基于列表框上的鼠标位置的项目。我有这个实现,但MouseOver事件只会在你没有拖动时触发。如何根据列表框的dragOver发明来选择项目。如何在DragOver事件中获取列表框选定项目
下面是代码
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
答
听起来像是你试图做的dragover热追踪个别列表项。
如果您使用的是WPF,则可以为ListBoxItems创建一个自定义模板,该模板会触发该模板。
如果不是:您可以在列表项自身上实现DragOver,而不仅仅是ListBox控件,并且您需要维护对当前热门项目的引用,以便您可以取消突出显示它。这意味着你的列表框必须填充一些自定义对象。
DragOver是冒泡事件,这意味着您应该能够在ListBox或Window级别放置ListBoxItem DragOver事件的处理程序,而不需要挂接单个项目。我没有测试过这个DragOver案例,但它对于其他路由事件确实很好。 – itowlson 2011-04-06 20:47:00
好吧,你是绝对正确的。我只是处理了ListBoxItem的Drop事件,并改变了选择的项目。那么一旦事件冒泡到列表框放置事件,我就可以将业务规则应用到对象。非常感谢, – 2011-04-06 21:12:27
谢谢你提醒我们所有的气泡。添加大量的个人处理程序肯定会让事情在一段时间后消失。我希望我能与你分享点数,itowlson。 – djdanlib 2011-04-07 15:19:49