После этой статьи для реализации перетаскивания вам потребуется обработать 2 события мыши, чтобы отложить перетаскивание до тех пор, пока мышь не переместится на определенное расстояние. Сначала добавьте обработчик для PreviewMouseDown, который хранит начальную позицию мыши относительно вашего элемента управления. Не используйте событие MouseDown, так как оно является пузырчатым событием и, возможно, было обработано дочерним элементом управления до достижения вашего элемента управления.
public class DraggableControl : UserControl
{
private Point? _initialMousePosition;
public DraggableControl()
{
PreviewMouseDown += OnPreviewMouseDown;
}
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) {
_initialMousePosition = e.GetPosition(this);
}
Кроме того, обработайте MouseMove, чтобы проверить пройденное расстояние и в конечном итоге инициировать операцию перетаскивания:
...
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(...);
}
}
}