我有一个包含两个WPF树形视图的程序,允许在两者之间拖放。问题是,打开/关闭树形视图中的项目可能会很烦人,因为只要鼠标移动一像素并按住左键,就会触发拖放功能。是否有办法指定鼠标移动多远才被认为是拖放?
我有一个包含两个WPF树形视图的程序,允许在两者之间拖放。问题是,打开/关闭树形视图中的项目可能会很烦人,因为只要鼠标移动一像素并按住左键,就会触发拖放功能。是否有办法指定鼠标移动多远才被认为是拖放?
这个可以通过系统参数来实现。如果你有
Point down = {where mouse down event happened}
Point current = {position in the MouseMove eventargs}
如果鼠标移动的距离达到最小拖动距离,则认为已经拖动了。
Math.Abs(current.X - down.X) >= SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(current.Y - down.Y) >= SystemParameters.MinimumVerticalDragDistance
在实现拖放的this文章中,您需要处理两个鼠标事件,以延迟拖动直到鼠标移动一定距离。首先,添加一个PreviewMouseDown的处理程序,它将存储与您的控件相关的初始鼠标位置。不要使用MouseDown事件,因为它是一个冒泡事件,并且可能已经被子控件处理了,无法到达您的控件。
public class DraggableControl : UserControl
{
private Point? _initialMousePosition;
public DraggableControl()
{
PreviewMouseDown += OnPreviewMouseDown;
}
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) {
_initialMousePosition = e.GetPosition(this);
}
...
public DraggableControl()
{
...
MouseMove += OnMouseMove;
}
...
private void OnMouseMove(object sender, MouseEventArgs e)
{
// Calculate distance between inital and updated mouse position
var movedDistance = (_initialMousePosition - e.GetPosition(this)).Length;
if (movedDistance > yourThreshold)
{
DragDrop.DoDragDrop(...);
}
}
}
在您的代码中加入一个小缓冲区,以确定拖动何时开始。