关于C#winform程序中listview控件LargeImageList模式下图标的拖放

fym_wlll 2016-08-15 08:30:17
关于C#winform程序中listview控件LargeImageList模式下图标的拖放,我想做出类似,在Windows桌面上不自动排列时,当用鼠标圈选几个图标后,拖到桌面上新的空白位置后松手,这几个图标也画在这个新位置了。这个需求我查遍网络也没解决,希望这里的高手帮我一下。若有满意答案,我QQ或支付宝100刀红包。另外,在Delphi里有setPosition,可以设置item到一个新位置,貌似C#中没此功能。
...全文
367 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fym_wlll 2016-08-15
  • 打赏
  • 举报
回复
qqamoon 太牛了! 帮了大忙,完美搞定!谢谢,我的qq是58503239,您加我有红包
巴士上的邂逅 2016-08-15
  • 打赏
  • 举报
回复
看错了,还带文字。 可以把PictureBox和Label放在一个panel里为一个元素,通过以上方法操作此类元素
巴士上的邂逅 2016-08-15
  • 打赏
  • 举报
回复
如果只是显示图标,可以在panel里放PictureBox,在panel的mouseDown、mouseUp、mouseMove事件里完成以上需求。 mouseDown时判断鼠标是在PictureBox上还是空白处,前者是拖动,后者是框选 。。。 。。。
fym_wlll 2016-08-15
  • 打赏
  • 举报
回复
类似于下图一样,listview中的图标,可以随意拖放改变位置:
龍过鸡年 2016-08-15
  • 打赏
  • 举报
回复 1


// 这个别忘了
// listView1.AllowDrop = true;
// listView1.AutoArrange = false;

private double getVector(Point pt1, Point pt2) // 获取两点间的距离
{
    var x = Math.Pow((pt1.X - pt2.X), 2);
    var y = Math.Pow((pt1.Y - pt2.Y), 2);
    return Math.Abs(Math.Sqrt(x - y));
}

private void listView1_DragOver(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(ListViewItem[])))
        e.Effect = DragDropEffects.Move;
}

private void listView1_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(ListViewItem[])))
    {
        var items = e.Data.GetData(typeof(ListViewItem[])) as ListViewItem[];

        var pos = listView1.PointToClient(new Point(e.X, e.Y));

        var offset = new Point(pos.X - startPoint.X, pos.Y - startPoint.Y);

        foreach (var item in items)
        {
            pos = item.Position;
            pos.Offset(offset);
            item.Position = pos;
        }
    }
}

Point startPoint = Point.Empty;

private void listView1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        startPoint = e.Location;
}

private void listView1_MouseMove(object sender, MouseEventArgs e)
{
    if (listView1.SelectedItems.Count == 0)
        return;

    if (e.Button == MouseButtons.Left)
    {
        var vector = getVector(startPoint, e.Location);
        if (vector < 50) return;

        var data = listView1.SelectedItems.OfType<ListViewItem>().ToArray();

        listView1.DoDragDrop(data, DragDropEffects.Move);
    }
}

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧