好的,首先查看Windows桌面的上下文;您可以在桌面上获取项目(文件夹,文件)并将它们拖动到不同的位置,然后它们“停留”在您拖动它们的位置。这似乎是一个非常有用的功能,为用户提供,以便他们创建自己的“分组”项目。
我的问题是: .NET中是否有一个控件用一组项来近似这种行为?
我正在考虑像“LargeIcon”模式中的listview,但它允许您将图标拖动到控件内的不同位置。
答案 0 :(得分:6)
您可以通过实施拖放操作,使用标准ListView控件执行此操作。这是一个执行此操作的示例控件:
using System;
using System.Drawing;
using System.Windows.Forms;
public class MyListView : ListView {
private Point mItemStartPos;
private Point mMouseStartPos;
public MyListView() {
this.AllowDrop = true;
this.View = View.LargeIcon;
this.AutoArrange = false;
this.DoubleBuffered = true;
}
protected override void OnDragEnter(DragEventArgs e) {
if (e.Data.GetData(typeof(ListViewItem)) != null) e.Effect = DragDropEffects.Move;
}
protected override void OnItemDrag(ItemDragEventArgs e) {
// Start dragging
ListViewItem item = e.Item as ListViewItem;
mItemStartPos = item.Position;
mMouseStartPos = Control.MousePosition;
this.DoDragDrop(item, DragDropEffects.Move);
}
protected override void OnDragOver(DragEventArgs e) {
// Move icon
ListViewItem item = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;
if (item != null) {
Point mousePos = Control.MousePosition;
item.Position = new Point(mItemStartPos.X + mousePos.X - mMouseStartPos.X,
mItemStartPos.Y + mousePos.Y - mMouseStartPos.Y);
}
}
}
答案 1 :(得分:1)
我认为ListView控件最接近,但即使这更像是一个资源管理器窗口。您可以创建自己的视图来执行您想要的操作,但您需要在某处手动保留图标位置。
答案 2 :(得分:1)
如果你不反对使用WPF,Josh Smith已经创建了一个非常整洁的画布,我目前正用于一个项目。它允许您添加控件并在画布上拖动它们。您必须处理画布上加载的内容以及下一次加载程序的位置,但这非常简单。 http://www.codeproject.com/KB/WPF/DraggingElementsInCanvas.aspx
答案 3 :(得分:1)
这取决于这是一个Windows应用程序还是基于Web浏览器的应用程序。在任何一种情况下,您都需要使用某种容器来管理控件的位置。您可以使用X和Y坐标管理容器内部控件的位置。
您可以使用拖动事件处理实际移动。因此,拖动时可以拖动(可以显示占位符图形或更改光标),最后拖动结束(将控件的x和y设置为新位置)。显然这些不是实际的事件名称,但搜索“如何处理拖动事件”应该可以帮助您开始。
在Web环境中,我知道jquery内置了拖动功能。所以你可能想看一下。你需要注意的一件大事就是在回发之间保持控件的位置。我不确定在这种情况下会发生什么。
答案 4 :(得分:0)
Windows使用ListView32
,一个内部控件,拖动n'删除占位符功能,自定义边框......
图标位置可以存储在XML文件中,也可以存储在应用程序设置中(通过将XML作为字符串并在需要时将其转换为文件)。
你可以做,例如:
<icons>
<icon1>
<name>Icon1</name>
<text>My PC</text>
<imageIndex>16</imageIndex>
</icon1>
<icon2>
.....
</icon2>
.....
</icons>
洛伦佐