【问题标题】:TreeViewItem Drag and Drop doesn't raise DragOver eventTreeViewItem 拖放不会引发 DragOver 事件
【发布时间】:2012-04-20 00:08:48
【问题描述】:

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

【问题讨论】:

    标签: c# wpf treeview treeviewitem


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我不清楚,我很抱歉,但我省略了启动 DoDragDrop 调用的部分。基本上我在“...”中使用 MouseMove 和 MouseLeftButtonDown 来启动拖动。基本上拖放工作正常,但如果我将鼠标悬停在 TreeViewItem 的右侧,则所有 TreeViewItems 上的 HitTest 都会失败,并且事件是从 TreeView 中的最低级别网格引发的。
    猜你喜欢
    • 2020-06-19
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多