Pregunta

Estoy escribiendo una pequeña función de arrastrar y soltar en el proyecto en el que estoy trabajando. He hecho este tipo de característica varias veces antes, y siempre uso una combinación de PreviewLeftMouseButtonDown y PreviewMouseMove para detectar el comienzo de un arrastre. Siempre ha funcionado antes.

En este proyecto, sin embargo, estoy encontrando PreviewMouseMove no se dispara cuando se hace clic en el botón del mouse izquierdo, a pesar de que el mouse se mueve claramente en la pantalla. He nunca visto esto antes y esto me está poniendo triste.

Este es el XAML que estoy usando:

<Grid Background="{StaticResource BGGradientBrush}"
      Margin="1"
      PreviewMouseLeftButtonDown="Grid_PreviewMouseLeftButtonDown"
      PreviewMouseMove="Grid_PreviewMouseMove">

      <!-- snip -->
</Grid>

Y este es mi código detrás:

    private Point _startDragPoint;
    private bool _isDragging;

    private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _startDragPoint = e.GetPosition(null);
        System.Diagnostics.Trace.WriteLine("Test => (PreviewMouseLeftButtonDown) left click at " + _startDragPoint);
    }

    private void Grid_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Trace.WriteLine("Test => (PreviewMouseMove) enter, e.LeftButton: " + e.LeftButton + ", _isDragging: " + _isDragging);

        if (e.LeftButton == MouseButtonState.Pressed && !_isDragging)
        {
            System.Diagnostics.Trace.WriteLine(
                "Test => (PreviewMouseMove) well, the left mouse button is pressed");

            var position = e.GetPosition(null);
            if (Math.Abs(position.X - _startDragPoint.X) > SystemParameters.MinimumHorizontalDragDistance ||
                Math.Abs(position.Y - _startDragPoint.Y) > SystemParameters.MinimumVerticalDragDistance)
            {
                StartDrag();
            }
        }
    }

    private void StartDrag()
    {
        System.Diagnostics.Trace.WriteLine("Test => (StartDrag) started drag!");
    }

Estoy monitoreando esas declaraciones de trazas a través de DebugView, y entre el tiempo Grid_PreviewMouseLeftButtonDown se dispara, hasta que se libera el botón del mouse izquierdo, Grid_PreviewMouseMove es nunca encendido.

Estoy completamente perplejo, ¿alguien puede detectar algo que estoy haciendo mal? Solo para verificarme a mí mismo, me he estado referiendo a Jaime Rodriquez's Arrastrar y soltar en WPF explicado de extremo a extremo Artículo y claramente estoy usando la misma técnica que es, entonces, ¿qué podría estar causando esto? Realmente espero que sea algo estúpido que me estoy perdiendo. ¿Algunas ideas?

¿Fue útil?

Solución

Estoy usando una infragística XAMDataGrid para alojar mis controles de usuario que requieren funcionalidad de arrastrar y soltar. Resulta que la cuadrícula atrapa los eventos de mouseMove cuando se presiona el botón del mouse izquierdo. Bastante irritante. No estoy seguro de cómo solucionarlo o trabajar en torno a él, pero al menos sé lo que va mal ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top