Frage

Ich schreibe eine kleine Drag & Drop -Funktion über das Projekt, an dem ich arbeite. Ich habe diese Art von Funktion bereits mehrmals gemacht und verwende immer eine Kombination von PreviewLeftMouseButtonDown und PreviewMouseMove um den Beginn eines Widerstandes zu erkennen. Es hat immer zuvor funktioniert.

Bei diesem Projekt finde ich jedoch PreviewMouseMove fasst nicht ab, wenn die linke Maustaste geklickt wird, obwohl sich die Maus eindeutig auf dem Bildschirm bewegt. Ich habe noch nie Ich habe das schon einmal gesehen und das macht mich traurig.

Dies ist der XAML, den ich benutze:

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

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

Und das ist mein Code dahinter:

    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!");
    }

Ich überwache diese Trace -Anweisungen über Debugview und zwischen der Zeit Grid_PreviewMouseLeftButtonDown wird abgefeuert, bis die linke Maustaste freigelassen wird, Grid_PreviewMouseMove ist noch nie gefeuert.

Ich bin völlig ratlos. Kann jemand etwas erkennen, das ich falsch mache? Nur zu Verhängung überprüfe ich mich auf Jaime Rodriquez's beziehe mich Drag & Drop in WPF erklärte End zu Ende Artikel und ich benutze eindeutig die gleiche Technik, die er ist. Was könnte dies also verursachen? Ich hoffe wirklich, dass es nur etwas Dummes ist, das mir fehlt. Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich verwende eine Infragistik xamdatagrid, um meine Benutzersteuerungen zu hosten, für die Drag & Drop -Funktionen erforderlich sind. Es stellt sich heraus, dass das Gitter die Ereignisse der Mousemove fängt, wenn die linke Maustaste gedrückt wird. Ziemlich irritierend. Ich bin mir nicht sicher, wie ich es reparieren oder herumarbeiten soll, aber zumindest weiß ich, was jetzt schief geht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top