Files
SamplePreSystem-CS/SamplePreSystem.UI/Behaviors/TreeViewDragBehavior.cs

86 lines
3.0 KiB
C#
Raw Normal View History

2026-04-30 11:34:41 +08:00
using Microsoft.Xaml.Behaviors;
using SamplePre.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace SamplePreSystem.UI.Behaviors
{
public class TreeViewDragBehavior :Behavior<TreeView>
{
// 拖拽起始点(用于判断是否是有效拖拽)
private Point _dragStartPoint;
protected override void OnAttached()
{
//记录鼠标按下时的坐标
AssociatedObject.PreviewMouseLeftButtonDown += AssociatedObject_PreviewMouseLeftButtonDown;
//处理TreeView的鼠标移动事件触发拖拽
AssociatedObject.PreviewMouseMove += AssociatedObject_PreviewMouseMove;
}
/// <summary>
/// 处理TreeView的鼠标移动事件触发拖拽
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private void AssociatedObject_PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
// 获取当前鼠标位置
Point currentPoint = e.GetPosition(null);
// 计算鼠标移动的距离(过滤掉微小移动,避免误触发拖拽)
Vector dragVector = _dragStartPoint - currentPoint;
// 如果鼠标左键按下,且移动距离超过阈值(系统默认的拖拽阈值),则开始拖拽
if (e.LeftButton == MouseButtonState.Pressed &&
(Math.Abs(dragVector.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(dragVector.Y) > SystemParameters.MinimumVerticalDragDistance))
{
// 获取当前鼠标下的TreeViewItem
var treeViewItem = FindVisualParent<TreeViewItem>(e.OriginalSource as DependencyObject);
if (treeViewItem != null && treeViewItem.DataContext is TreeListItem dragItem)
{
// 开始拖拽,设置拖拽数据和拖拽效果
DragDrop.DoDragDrop(treeViewItem, dragItem, DragDropEffects.Copy);
}
}
}
/// <summary>
/// 查找可视化树中的父级控件(通用方法)
/// </summary>
private T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
{
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
if (parentObject == null) return null;
if (parentObject is T parent)
return parent;
else
return FindVisualParent<T>(parentObject);
}
private void AssociatedObject_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// 记录鼠标按下时的坐标
_dragStartPoint = e.GetPosition(null);
}
}
}