2012-04-20 96 views
1

我目前正在使用附加的屬性來處理TreeView的拖放操作。長話短說我想使用附加屬性來啓用/禁用拖放操作。我設法讓所有的東西都能正常工作,而且我遇到了一個非常奇怪的問題。我正在監視TreeView.DragOver事件,以確定我要插入新項目的樹中的哪個位置。我的問題是,當我拖動到TreeViewItem的內容(I.e border或textBlock)的右側時,將生成DragOver事件,但將DragEventArgs.OriginalSource屬性設置爲TreeView控件的Grid元素。 Grid或TreeViewItem不應該生成一個事件嗎?TreeViewItem拖放不會引發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_;     
    } 
} 

我也試着使用的HitTest確定哪個樹型視圖鼠標位於其上,因爲的DragDrop不起作用似乎停止所有鼠標事件。

所以基本上我正在尋找使用TreeViewItem的整個右側作爲拖放的拖放區域,而不僅僅是託管項目內容的區域。有沒有人有什麼建議?

回答

2

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

ItemDrag:此事件從源樹視圖控制作爲 提出一旦用戶開始拖動樹節點。發生這種情況時,請撥打 DoDragDrop方法啓動拖放過程。

因此,您還需要爲ItemDrag添加事件處理程序,並在引發其他事件之前調用DoDragDrop。

+0

對不起,如果我不清楚,但我已經省略了我發起DoDragDrop調用的部分。基本上我在「...」中使用MouseMove和MouseLeftButtonDown來啓動拖動。基本上拖放工作正常,但如果我將鼠標懸停在TreeViewItem的右側,HitTest將在所有TreeViewItems上失敗,並從TreeView中的最低級別網格中引發事件。 – Etienne 2012-04-20 18:02:19