2016-07-12 36 views
3

Ich definiere Formen, die von der Klasse Shape erben und implementieren die 'Geometrie' Eigenschaft.mouse move ist schneller als redraw wpf

Hier ist ein Beispiel:

public class Landmark : Shape 
{ 
    public override bool IsInBounds(Point currentLocation) 
    { 

     return (((currentLocation.X >= Location.X - 3) && (currentLocation.X <= Location.X + 3)) && ((currentLocation.Y >= Location.Y - 3) && (currentLocation.Y <= Location.Y + 3))); 
    } 

    protected override Geometry DefiningGeometry 
    { 
     get 
     { 
      var landMark = new EllipseGeometry {Center = Location}; 

      Stroke = Brushes.Red; 
      return landMark; 
     } 
    } 

    protected override void OnIsMouseDirectlyOverChanged(DependencyPropertyChangedEventArgs e) 
    { 
     StrokeThickness = IsMouseDirectlyOver ? 12 : 6; 
     Mouse.OverrideCursor = IsMouseDirectlyOver ? Mouse.OverrideCursor = Cursors.ScrollAll : Mouse.OverrideCursor = Cursors.Arrow; 
    } 
    protected override void OnMouseMove(MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      Location = e.GetPosition(this); 
      InvalidateVisual(); 
     } 
    } 
} 

Wenn ich auf den Shape klicken und die Maus bewegen, erwarte ich, dass die Shape in der neuen Position neu gezeichnet werden - und es funktioniert.

Allerdings, wenn ich die Maus „zu“ schnell bewegen, dann ist ich „verlassen“ das OnMouseMove Ereignis und die shape wird in der letzten Position, die der Mauszeiger und die Shape ‚s Lage war in„stuck synchronisieren ".

Kann ein solches Problem gelöst werden?

Antwort

4

Ja, by capturing the Mouse.

Damit dies funktioniert, müssen Sie festlegen, wann und wann zu erfassen ist. Da Sie möchten, dass dies mit der linken Maustaste funktioniert, können Sie in OnMouseDown erfassen und die Maus in OnMouseUp freigeben.

+0

Danke! Das hat perfekt funktioniert. – Idanis