You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.4 KiB
57 lines
1.4 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Windows; |
|
using System.Windows.Input; |
|
|
|
namespace ICSharpCode.XamlDesigner |
|
{ |
|
public class DragListener |
|
{ |
|
public DragListener(FrameworkElement target) |
|
{ |
|
this.target = target; |
|
target.AddHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(MouseButtonDown), true); |
|
target.PreviewMouseMove += MouseMove; |
|
target.PreviewMouseLeftButtonUp += MouseLeftButtonUp; |
|
} |
|
|
|
public event MouseButtonEventHandler DragStarted; |
|
|
|
FrameworkElement target; |
|
Point startPoint; |
|
bool ready; |
|
MouseButtonEventArgs args; |
|
|
|
void MouseButtonDown(object sender, MouseButtonEventArgs e) |
|
{ |
|
if (e.ChangedButton == MouseButton.Left && Mouse.Captured == null) { |
|
ready = true; |
|
startPoint = e.GetPosition(target); |
|
args = e; |
|
target.CaptureMouse(); |
|
} |
|
} |
|
|
|
void MouseMove(object sender, MouseEventArgs e) |
|
{ |
|
if (ready) { |
|
var currentPoint = e.GetPosition(target); |
|
if (Math.Abs(currentPoint.X - startPoint.X) >= SystemParameters.MinimumHorizontalDragDistance || |
|
Math.Abs(currentPoint.Y - startPoint.Y) >= SystemParameters.MinimumVerticalDragDistance) { |
|
ready = false; |
|
if (DragStarted != null) { |
|
DragStarted(this, args); |
|
} |
|
} |
|
} |
|
} |
|
|
|
void MouseLeftButtonUp(object sender, MouseButtonEventArgs e) |
|
{ |
|
ready = false; |
|
target.ReleaseMouseCapture(); |
|
} |
|
} |
|
}
|
|
|