WPF C#: объекты Перестроения в поле списка через перетаскивание

Я пытаюсь выяснить, как переместиться, объекты в предзаполненном поле списка вверх и вниз через мышь перетаскивает.

Я посмотрел на Управление. Метод DoDragDrop из API Microsoft, но я все еще не могу заставить это делать что-либо.

Я ценил бы любую справку, так как я плохо знаком со средой Visual Studio.

56
задан EJoshuaS - Reinstate Monica 4 January 2019 в 21:16
поделиться

1 ответ

Я пробовал создать его, используя observablecollection, посмотрите

    ObservableCollection<Emp> _empList = new ObservableCollection<Emp>();

    public Window1()
    {
        InitializeComponent();

        _empList .Add(new Emp("1", 22));
        _empList .Add(new Emp("2", 18));
        _empList .Add(new Emp("3", 29));
        _empList .Add(new Emp("4", 9));
        _empList .Add(new Emp("5", 29));
        _empList .Add(new Emp("6", 9));
        listbox1.DisplayMemberPath = "Name";
        listbox1.ItemsSource = _empList;

        Style itemContainerStyle = new Style(typeof(ListBoxItem));
        itemContainerStyle.Setters.Add(new Setter(ListBoxItem.AllowDropProperty, true));
        itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(s_PreviewMouseLeftButtonDown)));
        itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.DropEvent, new DragEventHandler(listbox1_Drop)));
        listbox1.ItemContainerStyle = itemContainerStyle;
    }

Процесс перетаскивания

    void s_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {

        if (sender is ListBoxItem)
        {
            ListBoxItem draggedItem = sender as ListBoxItem;
            DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);
            draggedItem.IsSelected = true;
        }
    }

    void listbox1_Drop(object sender, DragEventArgs e)
    {
        Emp droppedData = e.Data.GetData(typeof(Emp)) as Emp;
        Emp target = ((ListBoxItem)(sender)).DataContext as Emp;

        int removedIdx = listbox1.Items.IndexOf(droppedData);
        int targetIdx = listbox1.Items.IndexOf(target);

        if (removedIdx < targetIdx)
        {
            _empList.Insert(targetIdx + 1, droppedData);
            _empList.RemoveAt(removedIdx);
        }
        else
        {
            int remIdx = removedIdx+1;
            if (_empList.Count + 1 > remIdx)
            {
                _empList.Insert(targetIdx, droppedData);
                _empList.RemoveAt(remIdx);
            }
        }
    }

Примечание:

  • одна вещь отстой в реализации, поскольку она использует PreviewMouseLeftButtonDown , перетаскиваемый элемент выглядит не выбранным
  • , а также для более простой реализации целью перетаскивания являются элементы окна списка, а не само поле списка - для этого может потребоваться лучшее решение
69
ответ дан 26 November 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: