#c_sharp #wpf
Имеется 4 ListBox, из трех которых можно перетаскивать и кидать элементы в четвертый, причем не перемещать, а копировать. Как прописать события принимающему ListBox? события ListBox, из которых таскать, прописал. из одного ListBox:в этот: для первого ListBox: private void helmet_MouseDown1(object sender, MouseButtonEventArgs e) { _startPoint = e.GetPosition(null); } private void helmet_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton != MouseButtonState.Pressed) return; Point mousePos = e.GetPosition(null); Vector diff = startPoint - mousePos; if (Math.Abs(diff.X) <= SystemParameters.MinimumHorizontalDragDistance && Math.Abs(diff.Y) <= SystemParameters.MinimumVerticalDragDistance) return; var lst = sender as ListBox; var li = FindAnchestor ((DependencyObject)e.OriginalSource); Console.WriteLine("move " + li); if (li == null) return; var str = lst.ItemContainerGenerator.ItemFromContainer(li); var data = new DataObject("txt", str); var res = DragDrop.DoDragDrop(li, data, DragDropEffects.All); if (res == DragDropEffects.Move) (lst.ItemsSource as IList).Remove(str); } static T FindAnchestor (DependencyObject current) where T : DependencyObject { do { if (current is T) return (T)current; current = VisualTreeHelper.GetParent(current); } while (current != null); return null; } UPDATE private void listHero_Drop(object sender, System.Windows.DragEventArgs e) { var o = e.Data.GetData("txt"); var lst = sender as ListBox; (lst.ItemsSource as IList).Add(o); e.Effects = DragDropEffects.Move; } private void ListHero_OnDragEnter(object sender, System.Windows.DragEventArgs e) { if (e.Data.GetDataPresent("txt")) e.Effects = DragDropEffects.Move; }`
Ответы
Ответ 1
как прописать события принимающему листбоксу? в xaml добавить Drop и DragEnterв cs добавить код обработчиков событий, примерно такой: void ListBox_Drop(object sender, DragEventArgs e) { var o = e.Data.GetData(...) as ...; ... e.Effects = DragDropEffects....; } void ListBox_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(...)) e.Effects = DragDropEffects....; } Код, который должен быть в обработчиках есть в примере тут. UPDATE: v1, перетаскивание строк -- заменил на следующий. UPDATE: v2, перетаскивания объектов разного типа. interface IData { } class Data1 : IData { public override string ToString() { return "Data1"; }} class Data2 : IData { public override string ToString() { return "Data2"; }} partial class MainWindow : Window { public MainWindow() { Items1 = new ObservableCollection
Комментариев нет:
Отправить комментарий