Перетащите несколько элементов из списка просмотра WPF - PullRequest
3 голосов
/ 03 августа 2011

У меня есть просмотр списка, который отображает файлы из каталога.
Пользователь может перетаскивать каждый элемент в просмотре списка в папку / на рабочий стол, и соответствующий файл копируется туда.
Это отлично работает.Проблема в том, что я хочу сделать это для нескольких элементов, чтобы пользователь мог выбрать несколько элементов списка, перетаскивать и копировать их вместе.ListView установлен в SelectedMode = Multiple, но он не копирует все выбранные элементы.Вот мой код:

    private void FileView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        this.start = e.GetPosition(null);
    }

    private void FileView_MouseMove(object sender, MouseEventArgs e)
    {
        Point mpos = e.GetPosition(null);
        Vector diff = this.start - mpos;

        if (e.LeftButton == MouseButtonState.Pressed &&
            Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
            Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
        {
            if (this.FileView.SelectedItems.Count == 0)
            {
                return;
            }

            // right about here you get the file urls of the selected items.  
            // should be quite easy, if not, ask.  
            string[] files = new String[1];
            files[0] = "C:\\Users\\MyName\\Music\\My playlist\\" + FileView.SelectedValue.ToString();
            string dataFormat = DataFormats.FileDrop;
            DataObject dataObject = new DataObject(dataFormat, files);
            DragDrop.DoDragDrop(this.FileView, dataObject, DragDropEffects.Copy);
        } 
    }

Спасибо!

Ответы [ 3 ]

5 голосов
/ 31 октября 2013
 private List<object> _selItems = new List<object>();
    private void FileView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        this._start = e.GetPosition(null);
        _selItems.Clear();
        _selItems.AddRange(FileView.SelectedItems.Cast<object>());

    }

восстановление на MouseMove

foreach (object selItem in _selItems)
            {
                if (!FileView.SelectedItems.Contains(selItem))
                    FileView.SelectedItems.Add(selItem);
            }
5 голосов
/ 03 августа 2011

Проблема в том, что вы используете SelectedValue для множественного выбора, поэтому вы получаете один файл.То, что вы хотите, это что-то вроде этого:

private void FileView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    this.start = e.GetPosition(null);
}

private void FileView_MouseMove(object sender, MouseEventArgs e)
{
    Point mpos = e.GetPosition(null);
    Vector diff = this.start - mpos;

    if (e.LeftButton == MouseButtonState.Pressed &&
        (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
         Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
    )
    {
        if (this.FileView.SelectedItems.Count == 0)
            return;

        // right about here you get the file urls of the selected items.  
        // should be quite easy, if not, ask.  
        string[] files = new String[FileView.SelectedItems.Count];
        int ix = 0;
        foreach (object nextSel in FileView.SelectedItems)
        {
            files[ix] = "C:\\Users\\MyName\\Music\\My playlist\\" + nextSel.ToString();
            ++ix;
        }
        string dataFormat = DataFormats.FileDrop;
        DataObject dataObject = new DataObject(dataFormat, files);
        DragDrop.DoDragDrop(this.FileView, dataObject, DragDropEffects.Copy);
    } 
}
3 голосов
/ 24 апреля 2013

Я хотел бы указать на небольшую ошибку в коде

    Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
    Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)

должно быть

    Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
    Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)

В противном случае прямая горизонтальная или вертикальная ничего не даст.Шансы на это малы, но все же ..

...