2011-04-06 2 views
0

나는 대상 목록 상자에서 목록 상자 위에 마우스 위치를 기준으로 항목을 선택하려는 소스 목록 상자에서 한 항목을 끌 때 두 개의 목록 상자가 있습니다. 이 구현되어 있지만 MouseOver 이벤트 경우에만 끌고 있지 않을 때 발생합니다. 목록 상자의 dragOver 발명품을 기반으로 항목을 선택하려면 어떻게해야합니까?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

는 소리 코드입니다.

WPF를 사용하는 경우 해당 트리거가있는 ListBoxItems에 대한 사용자 지정 템플릿을 만들 수 있습니다.

그렇지 않은 경우 : ListBox 컨트롤 대신 목록 항목 자체에서 DragOver를 구현할 수 있으며, 강조 표시를 해제 할 수 있도록 현재 핫 트랙 항목에 대한 참조를 유지해야합니다. 이것은 ListBox가 일부 사용자 정의 객체로 채워 져야 함을 의미합니다.

+1

DragOver는 버블 링 이벤트입니다. 즉, 개별 항목을 연결하지 않아도 ListBoxItem 또는 DragOver 이벤트에 대한 핸들러를 ListBox 또는 Window 레벨에 배치 할 수 있어야합니다. DragOver 경우에 대해이 기능을 테스트하지는 않았지만 다른 라우트 된 이벤트에 대해서는 잘 작동합니다. – itowlson

+1

네, 네 말이 맞아. 방금 ListBoxItem의 Drop 이벤트를 처리하고 선택한 항목을 그렇게 변경했습니다. 이벤트가 목록 상자 놓기 이벤트로 바뀌면 비즈니스 규칙을 개체에 적용 할 수있었습니다. 고마워요, –

+0

우리 모두에게 거품을 일으키는 것을 상기시켜 주셔서 감사드립니다. 개별 처리기를 많이 추가하면 잠시 후에 문제가 될 것입니다. 나는 너와 포인트를 공유 할 수 있었으면 좋겠다. – djdanlib

관련 문제