2014-07-25 3 views
0

Я прочитал исходный код MVVM Light, но, похоже, единственный пример Drag and Drop обрабатывает перетаскивание файла из окон. У меня есть ListView, и я хочу, чтобы каждый ListViewItem мог быть перенесен в мое приложение на другую панель, а также получать капли с другой панели. Я не могу найти ни одного твердого примера или учебника о том, где это сделать. Я надеялся, что у кого-то есть понимание?MVVM Light WPF Drag and Drop

ответ

2

Это Drag и поведение падения для моих привычках multiselectable TreeView, но я очистить код и он должен работать с ListView тонкой

public class DragAndDropBehavior<T> : Behavior<T> where T : ListView 
{ 
    #region Fields 

    private double tolerance = 20; 
    private double offset = 5; 
    private bool isDragging; 
    private Point startPosition; 

    #endregion Fields 

    #region Properties 
    public double Tolerance { get { return tolerance; } set { tolerance = value; } } 
    public double Offset { get { return offset; } set { offset = tolerance; } } 

    #endregion Properties 

    #region Methods 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.MouseLeftButtonDown += AssociatedObjectOnMouseLeftButtonDown; 
     AssociatedObject.MouseMove += AssociatedObjectOnMouseMove; 
     AssociatedObject.DragOver += AssociatedObjectOnDragOver; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     AssociatedObject.MouseLeftButtonDown -= AssociatedObjectOnMouseLeftButtonDown; 
     AssociatedObject.MouseMove -= AssociatedObjectOnMouseMove; 
     AssociatedObject.DragOver -= AssociatedObjectOnDragOver; 
    } 

    #endregion Methods 

    #region Handlers 

    private void AssociatedObjectOnDragOver(object sender, DragEventArgs e) 
    { 
     var control = sender as ItemsControl; 
     if (control == null) 
      return; 
     var scrollViewer = VisualTreeCustomHelper.FindVisualChild<ScrollViewer>(control); 
     var verticalPos = e.GetPosition(control).Y; 
     if (verticalPos < Tolerance) 
     { 
      scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - Offset); 
     } 
     if (verticalPos > control.ActualHeight - Tolerance) 
     { 
      scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + Offset); 
     } 
    } 

    private bool IsDragStart(Point position) 
    { 
     return Math.Abs(position.X - startPosition.X) > SystemParameters.MinimumHorizontalDragDistance || 
       Math.Abs(position.Y - startPosition.Y) > SystemParameters.MinimumVerticalDragDistance; 
    } 

    private void AssociatedObjectOnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     startPosition = e.GetPosition(null); 
    } 

    private void AssociatedObjectOnMouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton != MouseButtonState.Pressed || isDragging || !IsDragStart(e.GetPosition(null))) 
      return; 
     isDragging = true; 
     DragDrop.DoDragDrop(AssociatedObject, AssociatedObject.SelectedItem, DragDropEffects.Move); 
     isDragging = false; 
     } 

    #endregion Handlers 
} 

Это вспомогательный код (он был написан не мной)

public class VisualTreeCustomHelper 
{ 
    public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject 
    { 
     // Search immediate children first (breadth-first) 
     for (var i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      var child = VisualTreeHelper.GetChild(obj, i); 

      if (child is T) 
       return (T)child; 
      var childOfChild = FindVisualChild<T>(child); 

      if (childOfChild != null) 
       return childOfChild; 
     } 
     return null; 
    } 
} 

Теперь вы можете обрабатывать падение события, как это

private void ListView_OnDrop(object sender, DragEventArgs e) 
{ 
    var droppedItem = e.Data.GetData(ListView.SelectedItem.GetType()); 
    var target = e.OriginalSource as UIElement; 
    //Some operations with dropped item 
} 

Если вы хотите, вы можете обрабатывать событие drop в поведении и выполнять операции с элементом там.

И вы можете прочитать this tutorial о передовых правилах перетаскивания.