2010-11-20 9 views
1

Ich habe einige benutzerdefinierte Steuerelemente in meinem Canvas.Machen Sie einen Unterschied zwischen Auswählen und Ziehen in WPF

Diese Steuerelemente können per Drag & Drop verschoben oder per Klick ausgewählt werden.

nun implementiert ich die Drag and Drop etwas wie folgt aus:

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     base.OnPreviewMouseLeftButtonDown(e); 
     this.isDragInProgress = false; 

     // Cache the mouse cursor location. 
     this.origCursorLocation = e.GetPosition(this); 

     // Walk up the visual tree from the element that was clicked, 
     // looking for an element that is a direct child of the Canvas. 
     var source = e.Source; 

     var element = this.FindCanvasChild(source as DependencyObject); 

     if (element == null || !(element is MyControl)) 
      return; 

     this.ElementBeingDragged = element; 

     // Get the element's offsets from the four sides of the Canvas. 
     this.draggedLeft = Canvas.GetLeft(this.ElementBeingDragged); 
     this.darggedTop = Canvas.GetTop(this.ElementBeingDragged); 

     // Set the Handled flag so that a control being dragged 
     // does not react to the mouse input. 
     e.Handled = true; 

     this.isDragInProgress = true; 
    } 

Nun, mein Problem ist, dass ich nicht MyControl Maustaste darauf klicken ... (es gibt keine Mouseclick-Ereignis auf dem benutzerdefinierten Control, noch MouseDown funktioniert jetzt ..)

Wenn ich e.Handled = true; kommentieren wird das Steuerelement die Auswahl ändern, wenn Sie ziehen, wenn Sie es nicht kommentieren, wird das Steuerelement die Auswahl überhaupt nicht ändern .... (

Antwort

5

Anstatt den Ziehvorgang in einem M zu starten Mit dem ouseDown-Handler können Sie einen Anfangszustand speichern und stattdessen das Ziehen in einen MouseMove-Handler festlegen, wo Sie gegen SystemParameters.MinimumHorizontalDragDistance und SystemParameters.MinimumVerticalDragDistance überprüfen können, ob genügend Bewegung vorhanden ist, um eine Ziehoperation zu starten. Sie können dann Code in einen MouseUp-Handler einfügen, um entweder den Ziehvorgang abzuschließen oder, wenn er nie gestartet wurde, weil die Bewegung zu klein war, stattdessen eine Auswahl vorzunehmen.

0

Ich habe gerade einen Code-Projektartikel geschrieben, der Ihnen helfen könnte. Der Artikel befasst sich mit der Auswahl von Ziehen und Ziehen mehrerer Objekte.

Im MouseMove-Ereignishandler gibt es einen Code, der testet, dass der Benutzer über die Schwelldistanz hinaus schleppt. In diesem Fall wird der Ziehvorgang eingeleitet.

http://www.codeproject.com/KB/WPF/SimpleDragSelection.aspx

Verwandte Themen