2013-08-12 10 views
5

Bir bırakma hedefi olarak bir öğeyle bir sürükleme hedefi algıladığında önizleme/bırakma olaylarının tetiklendiğini varsayalım. Bu durumda, bırakma hedefim bir metin kutusudur ve sürükleme hedefim bir etikettir. Her ikisi de DB'den dinamik olarak oluşturulur. DragAdorner'ı sürüklerken, DragAdorner'ı uygulamadan önce klonlamak için DragAdorner kullanıyorum, DnD'm iyi çalışıyor ancak dragadorner'ı kullandıktan sonra işe yaramaz. Ve ben hata ayıklamaya çalıştığımda önizleme olayımın ateş olmadığını fark ettim. i benim için çok karmaşıkWPF C# ÖnizlemeDrop/Bırak olayı tetiklenmedi (Dragadorner ile)

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; 

} Ben http://www.adorkable.us/books/wpf_control_development.pdf (sayfa 103) görüldü

ama onun yol:

tbox.Drop += new DragEventHandler(tbox_PreviewDrop); // text box , Drop Target 
tbox.DragOver += new DragEventHandler(tbox_DragOver); 

Label lbl = new Label(); // Label , Drag Target 
      lbl.Content = s; 
      lbl.Width = Double.NaN; 
      lbl.Height = 40; 
      lbl.FontSize = 19; 
      lbl.PreviewMouseDown += new MouseButtonEventHandler(lbl_MouseDown); 
      lbl.PreviewMouseMove += new MouseEventHandler(lbl_MouseMove); 
      lbl.PreviewGiveFeedback += new GiveFeedbackEventHandler(lbl_GiveFeedback); 


    private void lbl_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     startPoint = e.GetPosition(this); 
     // Mouse.OverrideCursor = Cursors.None; 

    } 

    private void lbl_MouseMove(object sender, MouseEventArgs e) 
    { 

     if (e.LeftButton == MouseButtonState.Pressed) 
     { 

      // Mouse.OverrideCursor = Cursors.None; 

      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); 
      e.Handled = true; 

     } 
    } 



private 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.Effects = DragDropEffects.Move; 
      e.Handled = true; 

     } 

     private void tbox_DragOver(object sender, DragEventArgs e) 
     { 
      e.Handled = true; 
      e.Effects = DragDropEffects.Move; 

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

Ve adorner sınıf dosyası: Burada

benim kodlardır yeni biriyim

Diğer olaylar ile çakışan GiveFeedBack olayım nedeniyle mi?

cevap

3

DragAdorner'unuz her zaman imlecinizin altında olduğundan, bu düşüşü alan nesneye dönüşür. Adorner için yapıcıda IsHitTestVisible = false;'u ayarlarsanız, bunu düzeltmelidir.

Adorner üzerinde AllowDrop ayarlamamış olmanıza rağmen, imlecin altında olduğundan, bırakma girişiminde kesinti olur. Ancak düşüşü kabul etmediği için iptal edecektir.

Güncelleme

diğer sorun, DragDropEffects.Copy için sürükleme işlemde izin etkileri ayarı, ancak DragOver ve Drop işleyicilerindeki, bir DragDropEffects.Move yapmaya çalışıyoruz olmasıdır. Bu işlem, aynı işlem için değil gibi çalışmayacaktır. Bunlar eşleşmeli. sürükle hem işlemleri etkinleştirmek isterseniz, bir bitwise hem belirtmek veya edebilirsiniz:

DragDrop.DoDragDrop(source, dragData, DragDropEffects.Copy | DragDropEffects.Move); 

Güncelleme 2

Bir TextBox üzerine string başka bir şey bırakmak istiyorsanız, sahip PreviewDrop ve PreviewDragOver olaylarını kullanmak için. Aksi halde, TextBox'un varsayılan kullanımı başka bir şeyi göz ardı eder. Dolayısıyla şöyle görünebilir:

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

Merhaba, IsHitTestVisible = false ayarladı. Hala düşmeyecek. Maalesef, ikincil denemenizi düşürme girişimi ve – user2376998

+0

no'lu sayfalarda tam olarak anlayamadım. Temel olarak WPF, imleç konumunda bir isabet testi yapacak ve en fazla öğenin üzerine düşmeye çalışacaktır. Bu eleman damla kabul etmezse, işlem iptal edilir. Bu yüzden 'Adorner'ınız üzerinde hit testinin devre dışı bırakılması önemlidir (Adorner her zaman üstte). –

+0

Engellenmiş durumdayım, çalışmıyor, başka sorun var mı? – user2376998

0

Etiketinize arka plan rengi ayarlamayı deneyin ve düzgün çalışıp çalışmadığını görün.

+0

şeffaf mı? çalışmıyor – user2376998

+0

şeffaf değil, sadece bir renk – mat

+0

çalışmıyor/ – user2376998