2011-04-06 84 views
0

当我从源列表框中拖动一个项目时我有两个列表框我希望目标列表框选择基于列表框上的鼠标位置的项目。我有这个实现,但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 

回答

1

听起来像是你试图做的dragover热追踪个别列表项。

如果您使用的是WPF,则可以为ListBoxItems创建一个自定义模板,该模板会触发该模板。

如果不是:您可以在列表项自身上实现DragOver,而不仅仅是ListBox控件,并且您需要维护对当前热门项目的引用,以便您可以取消突出显示它。这意味着你的列表框必须填充一些自定义对象。

+1

DragOver是冒泡事件,这意味着您应该能够在ListBox或Window级别放置ListBoxItem DragOver事件的处理程序,而不需要挂接单个项目。我没有测试过这个DragOver案例,但它对于其他路由事件确实很好。 – itowlson 2011-04-06 20:47:00

+1

好吧,你是绝对正确的。我只是处理了ListBoxItem的Drop事件,并改变了选择的项目。那么一旦事件冒泡到列表框放置事件,我就可以将业务规则应用到对象。非常感谢, – 2011-04-06 21:12:27

+0

谢谢你提醒我们所有的气泡。添加大量的个人处理程序肯定会让事情在一段时间后消失。我希望我能与你分享点数,itowlson。 – djdanlib 2011-04-07 15:19:49

相关问题