2012-04-20 91 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