2016-06-10 10 views
0

Ich versuche, meine benutzerdefinierte Leiste für mein Fenster zu erstellen, und ich arbeite an dem Drag & Drop-Code, aber es funktioniert nicht wie erwartet.
Es funktioniert 'ok', weil es das Fenster schleppt, aber wenn ich ein wenig schneller mit der Maus gehe und es aus dem DragBar herauskommt, hört es auf zu arbeiten. Bei Windows Forms funktioniert es reibungslos mit fast der gleichen Vorgehensweise, aber bei WPS bekomme ich dieses Problem.Drag-Fenster aus der Leiste WPF

private Point mouseDown; //Mouse on click 
    private Point windowDown; //Window on click 
    private Vector mouseOffset; //Mouse on click - Mouse Actual Position 
    private bool drag;   //If drag is happening (between mouse Down and mouse Up) 

    private void DragBar_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     drag = true; 
     mouseDown = PointToScreen(Mouse.GetPosition(this)); 
     windowDown = new Point(this.Left, this.Top); 
    } 

    private void DragBar_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (drag) 
     { 
      mouseOffset = PointToScreen(Mouse.GetPosition(this)) - mouseDown; 
      this.Left = windowDown.X + mouseOffset.X; 
      this.Top = windowDown.Y + mouseOffset.Y; 
     } 
    } 
    private void DragBar_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     drag = false; 
    } 

~~ EDIT ___________________
Erhielt ein bisschen mehr Effizienz mit dieser Methode aber noch ‚verliert den Griff‘, wenn die Maus zu schnell wird. @Cody Grau Ich halte Position von Ereignis e für eine gute Praxis bekommen, aber es scheint nicht das Problem

private Point mouseDown; //Mouse position relative to form 
    private bool drag = false; //If drag is happening (between mouse Down and mouse Up) 

    private void DragBar_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     drag = true; 
     mouseDown = e.GetPosition(this); 
    } 

    private void DragBar_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (drag) 
     { 
      this.Left = PointToScreen(e.GetPosition(this)).X - mouseDown.X; 
      this.Top = PointToScreen(e.GetPosition(this)).Y - mouseDown.Y; 
     } 
    } 
    private void DragBar_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     drag = false; 
    } 
+0

Vielleicht, weil Sie 'Mouse.GetPosition' verwenden (die die aktuelle Position zurückgibt) statt der Position, wenn das Ereignis' MouseMove' ausgelöst wurde. Verwenden Sie stattdessen den Parameter "e". –

+0

@Cody Gray bekommen es aus dem Ereignis hilft nicht auf das Problem, der einzige wirkliche Unterschied, den ich aus dem Code von Windows Forms habe ich sehen konnte, ist, dass ich habe eine Funktion, die beide zur gleichen Zeit ändert, SetDesktopLocation (X, Y), und auf WPF muss ich sie einzeln festlegen, ich frage mich, ob das etwas mit dem Thema zu tun hat. – BrunoWB

Antwort

0

Guy ich wies darauf hin, gibt es einen einfacheren Weg, dies zu tun, arbeiten, um zu helfen.

In dem Fenster des XAML

 <Border x:Name="DragBar" 
      Height="100" 
      MouseLeftButtonDown="DragBar_MouseLeftButtonDown" /> 

-Code hinter

private void DragBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     this.DragMove(); 
    } 

Erledigt.