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