我目前正在使用附加属性为TreeView实现拖放。长话短说我想使用附加属性来启用/禁用拖放。我已经设法让一切正常,我遇到了一个非常奇怪的问题。我正在监视TreeView.DragOver事件以确定树中我将要插入新项目的位置。我的问题是,当我拖动到TreeViewItem的内容(即边框或textBlock)的右侧时,会生成DragOver事件,但DragEventArgs.OriginalSource属性设置为TreeView控件的Grid元素。 Grid或TreeViewItem不应该生成事件吗?
以下是与事件相关的代码片段:
/// 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来确定鼠标位于哪个TreeViewItem上,因为DragDrop似乎停止了所有鼠标事件。
所以基本上我希望使用TreeViewItem的整个右侧作为拖放的放置区域,而不仅仅是托管项目内容的区域。有没有人有什么建议?
答案 0 :(得分:2)
http://support.microsoft.com/kb/307968
ItemDrag:此事件从源TreeView控件引发为 用户开始拖动树节点。发生这种情况时,请致电 用于启动拖放过程的DoDragDrop方法。
因此,您还需要为ItemDrag添加事件处理程序,并在引发其他事件之前调用DoDragDrop。