1

我目前正在使用附加属性为 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 的整个右侧作为拖放区域,而不仅仅是承载项目内容的区域。有没有人有什么建议?

4

1 回答 1

2

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

ItemDrag:一旦用户开始拖动树节点,就会从源 TreeView 控件引发此事件。发生这种情况时,调用 DoDragDrop 方法来启动拖放过程。

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

于 2012-04-20T00:40:33.310 回答