2012-04-20 1 views
1

현재 연결된 속성을 사용하여 TreeView의 끌어서 놓기 구현에 대해 작업하고 있습니다. 긴 이야기 짧게 드래그 앤 드롭을 사용/사용 중지하는 데 첨부 된 속성을 사용하고 싶습니다. 나는 모든 것을 작동시킬 수 있었고, 나는 정말로 이상한 문제를 겪고있다. TreeView.DragOver 이벤트를 모니터링하여 트리에서 새 항목을 삽입 할 위치를 확인합니다. 내 문제는 TreeViewItem의 내용 (즉, border 또는 textBlock)의 오른쪽으로 끌면 DragOver 이벤트가 생성되지만 DragEventArgs.OriginalSource 속성은 TreeView 컨트롤의 Grid 요소로 설정된다는 것입니다. 그리드 또는 TreeViewItem 이벤트를 생성해야합니까?TreeViewItem DragOver 이벤트가 DragOver 이벤트를 발생시키지 않습니다.

/// Property Changed callback when you set DragDrop attached property 
private static void OnDragDropPropertyChanged_(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
{ 
    TreeView control = (TreeView)obj; 

    if ((bool)args.NewValue == true) 
    { 
     control.AllowDrop = true; 

     ... 

     control.DragEnter += OnTreeViewDragEnter_; 
     control.DragLeave += OnTreeViewDragLeave_; 
     control.DragOver += OnTreeViewDragOver_; 
     control.Drop += OnTreeViewDrop_;     
    } 
} 

나는 또한 마우스를 끌어서 놓기 때문에 작동하지 않는 이상 위치 TreeViewItem을 결정하는 그러나 hitTest를 사용하려고했습니다

다음은이 이벤트에 묶어 코드의를 싹둑되어 다음 모든 마우스 이벤트를 중지하는 것 같습니다.

기본적으로 TreeViewItem의 오른쪽 전체를 항목의 내용을 호스팅하는 영역뿐만 아니라 끌어서 놓기 영역으로 사용하려고합니다. 누구든지 어떤 제안이 있습니까?

답변

2

http://support.microsoft.com/kb/307968

ItemDrag :이 이벤트는 사용자가 트리 노드를 끌기 시작하자마자 때 원본 TreeView 컨트롤에서 발생합니다. 이 경우 DoDragDrop 메서드를 호출하여 끌어서 놓기 절차를 시작하십시오.

그래서 다른 이벤트가 발생하기 전에 ItemDrag에 대한 이벤트 처리기를 추가하고 DoDragDrop을 호출해야합니다.

+0

내가 명확하지 않다면 미안하지만 DoDragDrop 호출을 시작한 부분은 생략했습니다. 기본적으로 나는 "..."에서 드래그를 시작하기 위해 MouseMove 및 MouseLeftButtonDown을 사용합니다. 기본적으로 끌어서 놓기가 잘 작동하지만 TreeViewItem 오른쪽으로 마우스를 가져 가면 HitTest가 모든 TreeViewItems에서 실패하고 이벤트가 TreeView의 가장 낮은 레벨 그리드에서 발생합니다. – Etienne