using System.Windows;
using GongSolutions.Wpf.DragDrop;
using BetterGenshinImpact.ViewModel.Pages.Component;
namespace BetterGenshinImpact.View.Pages.Component;
///
/// 齿轮任务拖拽处理器,实现拖拽时的验证逻辑
///
public class GearTaskDragDropHandler : IDropTarget
{
///
/// 静态实例,用于XAML绑定
///
public static GearTaskDragDropHandler Instance { get; } = new GearTaskDragDropHandler();
public void DragOver(IDropInfo dropInfo)
{
// 获取拖拽的源数据和目标数据
var sourceItem = dropInfo.Data as GearTaskViewModel;
var targetItem = dropInfo.TargetItem as GearTaskViewModel;
// 如果源数据不是GearTaskViewModel,不允许拖拽
if (sourceItem == null)
{
dropInfo.Effects = DragDropEffects.None;
return;
}
// 如果目标是任务组,允许拖拽到其下
if (targetItem != null && targetItem.IsDirectory)
{
dropInfo.Effects = DragDropEffects.Move;
dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
return;
}
// 如果目标是任务节点(非任务组),允许在同级之间调整顺序
if (targetItem != null && !targetItem.IsDirectory)
{
// 检查插入位置,允许在节点之间插入
if (dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.BeforeTargetItem) ||
dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.AfterTargetItem))
{
dropInfo.Effects = DragDropEffects.Move;
dropInfo.DropTargetAdorner = DropTargetAdorners.Insert;
return;
}
}
// 如果是拖拽到根节点,允许拖拽
if (targetItem == null)
{
dropInfo.Effects = DragDropEffects.Move;
dropInfo.DropTargetAdorner = DropTargetAdorners.Insert;
return;
}
// 其他情况不允许拖拽
dropInfo.Effects = DragDropEffects.None;
}
public void Drop(IDropInfo dropInfo)
{
// 获取拖拽的源数据和目标数据
var sourceItem = dropInfo.Data as GearTaskViewModel;
var targetItem = dropInfo.TargetItem as GearTaskViewModel;
// 如果源数据不是GearTaskViewModel,不执行拖拽
if (sourceItem == null)
{
return;
}
// 如果目标是任务组,允许拖拽到其下
if (targetItem != null && targetItem.IsDirectory)
{
GongSolutions.Wpf.DragDrop.DragDrop.DefaultDropHandler.Drop(dropInfo);
return;
}
// 如果目标是任务节点(非任务组),允许在同级之间调整顺序
if (targetItem != null && !targetItem.IsDirectory)
{
// 检查插入位置,允许在节点之间插入
if (dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.BeforeTargetItem) ||
dropInfo.InsertPosition.HasFlag(RelativeInsertPosition.AfterTargetItem))
{
GongSolutions.Wpf.DragDrop.DragDrop.DefaultDropHandler.Drop(dropInfo);
return;
}
}
// 如果是拖拽到根节点,允许拖拽
if (targetItem == null)
{
GongSolutions.Wpf.DragDrop.DragDrop.DefaultDropHandler.Drop(dropInfo);
return;
}
}
}