树视图项拖放不会引发拖动事件

本文关键字:拖动 事件 视图 拖放 | 更新日期: 2023-09-27 18:31:48

我目前正在使用附加属性实现树视图的拖放。长话短说,我想使用附加属性来启用/禁用拖放。我已经设法让一切正常,但我遇到了一个非常奇怪的问题。我正在监视 TreeView.DragOver 事件,以确定我将在树中插入新项的位置。我的问题是,当我拖动到TreeViewItem内容(即边框或textBlock)的右侧时,会生成DragOver事件,但DragEventArgs.OriginalSource属性设置为TreeView控件的Grid元素。网格或树视图项不应该生成事件吗?

以下是与事件相关的代码截图:

/// 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 的整个右侧作为拖放的放置区域,而不仅仅是托管项目内容的区域。有人有什么建议吗?

树视图项拖放不会引发拖动事件

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

ItemDrag:此事件从源树视图控件引发为 一旦用户开始拖动树节点。发生这种情况时,请调用 用于启动拖放过程的方法。

因此,您还需要为 ItemDrag 添加一个事件处理程序,并在引发其他事件之前调用 DoDragDrop。