Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Перетащить элемент из одного ListBox'a в другой

#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() { new Data1(), new Data2() }; Items2 = new ObservableCollection(); this.DataContext = this; } public ObservableCollection Items1 { get; set; } public ObservableCollection Items2 { get; set; } Point startPoint; void DragList_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { startPoint = e.GetPosition(null); } void DragList_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 o = lst.ItemContainerGenerator.ItemFromContainer(li); var data = new DataObject(typeof(IData), o); var res = DragDrop.DoDragDrop(li, data, DragDropEffects.All); if (res == DragDropEffects.Move) (lst.ItemsSource as IList).Remove(o); } void ListBox_Drop(object sender, DragEventArgs e) { var o = e.Data.GetData(typeof(IData)); var lst = sender as ListBox; (lst.ItemsSource as IList).Add(o); e.Effects = DragDropEffects.Move; } void ListBox_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(IData))) e.Effects = DragDropEffects.Move; } 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; } }

Комментариев нет:

Отправить комментарий