2010-11-20 40 views
1

我的Canvas中有一些自定義控件。在WPF中區別選擇和拖動

該控件可以通過拖放來移動,也可以通過單擊進行選擇。現在

,我實現拖放是這樣的:

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; 
    } 

現在,我的問題是,我無法選擇它MyControl點擊......(沒有鼠標點擊事件上的自定義控制,也不MouseDown現在的作品..)

如果我會評論e.Handled = true;控制將改變它的選擇拖動時,如果不評論它,控制將不會改變它的選擇......(

回答

5

與其在M中開始拖動操作ouseDown處理程序,您可以保存一些初始狀態,而是承諾在MouseMove處理程序中進行拖動,您可以在SystemParameters.MinimumHorizontalDragDistanceSystemParameters.MinimumVerticalDragDistance之間檢查是否有足夠的移動來開始拖動操作。然後,您可以將代碼包含在MouseUp處理程序中,以完成拖動操作,或者如果由於移動太小而從未開始,請執行select操作。

0

我剛剛寫了一篇代碼項目文章,可能會幫助你。文章是關於拖動選擇和多個項目拖動。

在MouseMove事件處理程序中,有一些代碼用於測試用戶拖動比閾值距離更遠的距離,此時發生拖動操作。

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