首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从WPF列表视图中拖动多个项目

从WPF列表视图中拖动多个项目
EN

Stack Overflow用户
提问于 2011-08-03 23:59:41
回答 3查看 9.2K关注 0票数 3

我有一个列表视图,可以显示目录中的文件。

用户可以将列表视图中的每个项目拖到文件夹/桌面,并且关联的文件被复制到那里。

这可以很好地工作。问题是--我想对多个项目这样做--这样用户就可以选择多个列表条目,并将它们拖放到一起。ListView被设置为SelectedMode=Multiple-但它不会复制所有选定的项目。下面是我的代码:

代码语言:javascript
复制
    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);
        } 
    }

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-04 00:37:54

这里的问题是,您使用SelectedValue进行多选操作,因此只能得到一个文件。你需要的是更像这样的东西:

代码语言:javascript
复制
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);
    } 
}
票数 5
EN

Stack Overflow用户

发布于 2013-11-01 01:38:04

代码语言:javascript
复制
 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上恢复

代码语言:javascript
复制
foreach (object selItem in _selItems)
            {
                if (!FileView.SelectedItems.Contains(selItem))
                    FileView.SelectedItems.Add(selItem);
            }
票数 7
EN

Stack Overflow用户

发布于 2013-04-24 08:35:16

我想指出代码中的一个小错误

代码语言:javascript
复制
    Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
    Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)

应该是

代码语言:javascript
复制
    Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
    Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)

否则,直线、水平或垂直将不起任何作用。这种情况发生的可能性很小,但仍然..

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6929474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档