2010-01-14 15 views
8

Tengo un programa con dos vistas de árbol de WPF que permiten arrastrar y soltar entre los dos. El problema es que puede ser molesto abrir/cerrar elementos en las vistas de árbol porque mover el mouse un solo píxel mientras se mantiene presionado el botón izquierdo del mouse activa la función de arrastrar/soltar. ¿Hay alguna manera de especificar qué tan lejos debe moverse el mouse antes de que se lo considere una operación de arrastrar/soltar?Umbral de distancia de arrastre WPF

+0

Se puede publicar algo de código? – ChrisF

Respuesta

1

Simplemente crea un pequeño búfer en tu código que determina cuándo se inicia el arrastre.

  1. ratón pare a
  2. al mover el ratón - comprobar ratón hacia abajo .. si es así, comprobar para ver si su movido más lejos que el búfer que especifique (3 píxeles es probablemente bueno)
  3. si tiene , inicia el arrastre.
16

Hay un parámetro de sistema para esto. Si tiene

Point down = {where mouse down event happened} 
Point current = {position in the MouseMove eventargs} 

entonces el ratón se ha movido la distancia mínima resistencia si

Math.Abs(current.X - down.X) >= SystemParameters.MinimumHorizontalDragDistance || 
Math.Abs(current.Y - down.Y) >= SystemParameters.MinimumVerticalDragDistance) 
0

Siguiendo this artículo para arrastrar y soltar aplicación, que tendría que manejar 2 eventos del ratón con el fin de retrasar el arrastre hasta que el mouse se haya movido una cierta distancia. Primero, agregue un controlador para PreviewMouseDown que almacena la posición inicial del mouse relativa a su control. No use el evento MouseDown porque es un evento de burbujeo y puede haber sido manejado por un control secundario antes de alcanzar su control.

public class DraggableControl : UserControl 
{ 
    private Point? _initialMousePosition; 

    public DraggableControl() 
    { 
    PreviewMouseDown += OnPreviewMouseDown; 
    } 

    private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) { 
    _initialMousePosition = e.GetPosition(this); 
    } 

Además, manejar MouseMove para comprobar la distancia recorrida y, finalmente, iniciar la operación de arrastre: