Files
SamplePreSystem-CS/SamplePreSystem.UI/Behaviors/TreeViewDragBehavior.cs
2026-04-30 11:34:41 +08:00

86 lines
3.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}
}