2013-08-05 64 views
1

我用一拖裝飾器克隆我的標籤(拖動目標),但現在卻我不能我的標籤拖放到我的文本框的圖像,拖放與拖放裝飾器

這是我使用的代碼(U可能會看到那裏有previewdragover,我寫了e.Handled = true在previewdragover但並不能幫助)我還設置tbox.AllowDrop爲true:

文本框:

tbox.PreviewDrop += new DragEventHandler(tbox_PreviewDrop); 
    tbox.PreviewDragOver += new DragEventHandler(tbox_PreviewDragOver); 

處理程序文本框:

protected void tbox_PreviewDrop(object sender, DragEventArgs e) 
    { 
     (sender as TextBox).Text = string.Empty; // Empty the textbox from previous answer. 
     (sender as TextBox).Background = Brushes.White; 
     e.Handled = true; 
    } 

標籤(拖動目標):

   Label lbl = new Label(); 
      lbl.Content = s; 
      lbl.Width = Double.NaN; 
      lbl.Height = 40; 
      lbl.FontSize = 19; 
      lbl.MouseDown += new MouseButtonEventHandler(lbl_MouseDown); 
      lbl.MouseMove += new MouseEventHandler(lbl_MouseMove); 
      lbl.GiveFeedback += new GiveFeedbackEventHandler(lbl_GiveFeedback); 
      lbl.MouseUp += new MouseButtonEventHandler(lbl_MouseUp); 
      wrapPanel2.Children.Add(lbl); 

處理程序標籤:

 private void lbl_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     Mouse.OverrideCursor = Cursors.Arrow; 
    } 

    private void lbl_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     startPoint = e.GetPosition(this); 

    } 

    private void lbl_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 


      var source = sender as UIElement; 
      Label lbl = sender as Label; 
      Point current = e.GetPosition(this); 
      Vector diff = startPoint - current; 

      if (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || 
       Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance) 
      { 

       adorner = new DragAdorner(lbl, e.GetPosition(lbl)); 
       AdornerLayer.GetAdornerLayer(lbl).Add(adorner); 

       var dragData = new DataObject(this); 
       DragDrop.DoDragDrop(source, dragData, DragDropEffects.Copy); 
       AdornerLayer.GetAdornerLayer(lbl).Remove(adorner); 
      } 
      startPoint = current; 
     } 
    } 

    private void lbl_GiveFeedback(object sender, GiveFeedbackEventArgs e) 
    { 
     if (adorner != null) 
     { 
      Label lbl = sender as Label; 
      var pos = lbl.PointFromScreen(GetMousePosition()); 
      adorner.UpdatePosition(pos); 
     } 
    } 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool GetCursorPos(ref Win32Point pt); 

    [StructLayout(LayoutKind.Sequential)] 
    internal struct Win32Point 
    { 
     public Int32 X; 
     public Int32 Y; 
    }; 

    public static Point GetMousePosition() 
    { 
     Win32Point w32Mouse = new Win32Point(); 
     GetCursorPos(ref w32Mouse); 
     return new Point(w32Mouse.X, w32Mouse.Y); 
    } 

    private Point startPoint; 
    private DragAdorner adorner; 

現在我可以用拖動標籤下我的光標標籤,但我不能在任何拖放文本框。

-----編輯------------

我已經把在dragenter的文本框是這樣的:

 private void tbox_PreviewDragEnter(object sender, DragEventArgs e) 
    { 
     if (sender == e.Source) 
     { 
      e.Effects = DragDropEffects.None; 
     } 

    } 

仍然沒有工作壽。

我會在這裏添加DragAdorner.cs,我用(我從一些中國網站得到了它):

public class DragAdorner : Adorner { 

public DragAdorner(UIElement adornedElement, Point offset) 

    : base(adornedElement) { 

    this.offset = offset; 

    vbrush = new VisualBrush(AdornedElement); 
    vbrush.Opacity = .7; 

} 



public void UpdatePosition(Point location) { 

    this.location = location; 

    this.InvalidateVisual(); 

} 



protected override void OnRender(DrawingContext dc) { 

    var p = location; 

    p.Offset(-offset.X, -offset.Y); 

    dc.DrawRectangle(vbrush, null, new Rect(p, this.RenderSize)); 

} 



private Brush vbrush; 

private Point location; 

private Point offset; 

回答

0

你的代碼是對我工作的例子有些不同,但我認爲我可以看到你的問題。在我的代碼中,我有一個名爲UpdateDragDropEffects的方法。這種方法需要在名爲eDragEventArgs類型的對象,並更新e.Effects屬性取決於e.AllowedEffects財產的價值,也是我是否有一個有效的ICommand實例調用和數據是否是預期的類型等

調用此方法(並從中傳出DragEventArgs對象)兩種典型的拖放方法; DragTargetPreviewDrop(處理PreviewDrop事件)和AdornedUIElementPreviewDragOver(處理PreviewDragOver事件)。設置DragEventArgs對象的e.Effects屬性會告訴系統當前的拖動操作是否有效並應繼續或不繼續...未設置或將其設置爲DragDropEffects.None將會導致不顯示任何有效的拖放目標。

MSDN上的Drag and Drop Overview頁面有代碼示例,它們也應該可以幫助您。 Enabling an Element to be a Drop Target部分的示例代碼顯示了我所描述的內容。

您可能還有其他問題,但如果這對您沒有幫助,請回來並更新。

+0

以前我用裝飾器,我拖和拖放效果很好。我在我的文本框中有預覽和dragover,但我真的需要我的文本框DragEnter處理程序?因爲它表示當輸入系統報告一個將此元素作爲拖動目標的基礎事件時發生,我的文本框是放置目標... – user2376998

+0

這是否與我的DragAdorner.cs有關?因爲有時當我拖動目標時,我用鼠標移動得非常快,光標有時會顯示掉符號,但大部分時間是默認光標,它是中間有一條線的黑色圓圈 – user2376998

+0

我仍然認爲它是因爲你沒有將'e.Effects'設置爲有效值......你添加了一個編輯,但是設置了'e.Effects = DragDropEffects.None;'。這就像取消你的拖放操作。您需要根據您的意願和'DragEventArgs'實例的'e.AllowedEffects'屬性的值將其設置爲'DragDropEffects.Copy'或'DragDropEffects.Move'。另外,我不知道你爲什麼把它放到'tbox_PreviewDragEnter'處理程序中......我說要從'PreviewDrop'或'PreviewDragOver'事件處理程序(放置目標*的*)調用它。 – Sheridan

0

用點(-5,-5)初始化您的Dragadorner。 (新的DragAdorner(新點(-5,-5));)

Drop事件似乎在Adorner上拋出。如果你向Adorner添加一個拖放處理程序,你會發現當你釋放鼠標時它會被調用。

看來,鼠標指針在裝飾器,並把它作爲目標。

設置偏移到一個點,使得裝飾器是沒有根據的MousePointer糾正這種行爲。

+0

歡迎來到堆棧溢出!花點時間閱讀幫助中心的[編輯幫助](http://stackoverflow.com/editing-help)。堆棧溢出的格式與其他站點不同。 – SmokeDispenser

2

的問題是,你的裝飾器的阻力總是在最前面。當你試圖放棄你的標籤時,它將落在裝飾者身上,而不是基礎部分。

爲了避免這種情況下面一行添加到DragAdorner的構造。

IsHitTestVisible = FALSE;