Я прочитал исходный код MVVM Light, но, похоже, единственный пример Drag and Drop обрабатывает перетаскивание файла из окон. У меня есть ListView, и я хочу, чтобы каждый ListViewItem мог быть перенесен в мое приложение на другую панель, а также получать капли с другой панели. Я не могу найти ни одного твердого примера или учебника о том, где это сделать. Я надеялся, что у кого-то есть понимание?MVVM Light WPF Drag and Drop
0
A
ответ
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 о передовых правилах перетаскивания.
Смежные вопросы
- 1. WPF MVVM Drag & Drop
- 2. WPF GRID to GRID drag and drop
- 3. drag and drop в winforms или wpf
- 4. WPF Drag and Drop объект из списка
- 5. Flex Drag and Drop
- 6. drag and drop picturebox
- 7. Python drag and drop
- 8. drag and drop uiautomation
- 9. TreeTableView drag and drop
- 10. Drag and Drop VideoView
- 11. Java Drag and drop
- 12. Tkinter drag and drop
- 13. ListView drag and drop
- 14. RadPanelBar Drag And Drop
- 15. Dojo Drag and Drop
- 16. jquery drag and drop
- 17. ItemsControl Drag and Drop
- 18. Переводчик Drag And Drop
- 19. Drag and Drop DataGrid
- 20. Flex Drag and Drop
- 21. RemoteApp Drag-and-Drop
- 22. jquery drag and drop
- 23. drag and drop jquery
- 24. Multiselect Drag and Drop
- 25. Вкладки Drag And Drop
- 26. angular2 drag and drop
- 27. JQuery drag and drop
- 28. Drag And Drop LibGDX
- 29. Drag and drop gwt
- 30. Drag and Drop Imageview