代码之家  ›  专栏  ›  技术社区  ›  BKimmel

.NET:是否有单击并拖动“桌面式”控件?

  •  2
  • BKimmel  · 技术社区  · 17 年前

    好的,首先查看Windows桌面的上下文;您可以将桌面上的项目(文件夹、文件)拖到不同的位置,然后将它们“留在”您拖到的位置。这似乎是为用户提供的一个非常有用的功能,以便允许他们创建自己的项目“分组”。

    我的问题是: .NET中是否有一个控件用一组项来近似这种行为?

    我在想“largeicon”模式下的ListView,但它允许您将图标拖动到控件内的不同位置。

    5 回复  |  直到 10 年前
        1
  •  6
  •   Hans Passant    16 年前

    您可以通过实现拖放来使用标准的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);
        }
      }
    }
    
        2
  •  1
  •   Joel Coehoorn    17 年前

    我认为最接近的是listview控件,但这更像是一个资源管理器窗口。您可能可以创建自己的视图来满足您的需要,但是您需要在某个地方手动保存图标位置。

        3
  •  1
  •   Totty    17 年前

    如果您不反对使用WPF,JoshSmith已经创建了一个非常整洁的画布,我目前正在为一个项目使用它。它允许您添加控件并在画布上拖动它们。您必须处理画布上加载的内容以及程序下一次加载的位置,但这非常简单。 http://www.codeproject.com/KB/WPF/DraggingElementsInCanvas.aspx

        4
  •  1
  •   Haydar    17 年前

    这取决于这是Windows应用程序还是基于Web浏览器的应用程序。在这两种情况下,都需要某种容器来管理控件的位置。可以使用控件的X和Y坐标管理容器中控件的位置。

    您将使用拖动事件处理实际移动。因此,您可以在拖动的同时开始拖动(可能会显示一个占位符图形或更改光标),最后拖动结束(将控件的X和Y设置为新位置)。显然,这些不是实际的事件名称,但是搜索“如何处理拖动事件”应该可以开始。

    在Web环境中,我知道jquery内置了拖动功能。所以你可能想看看这个。你要小心的一件大事就是在回发之间保持你的控件的位置。我不知道在这种情况下会发生什么。

        5
  •  0
  •   Draken R. Shilling    10 年前

    Windows使用 ListView32 ,具有拖放占位符功能的内部控件,自定义边框…

    图标位置可以存储在XML文件中,也可以存储在应用程序设置中(通过将XML作为字符串,并在需要时将其转换为文件)。

    您可以这样做,例如:

    <icons>
        <icon1>
            <name>Icon1</name>
            <text>My PC</text>
            <imageIndex>16</imageIndex>
        </icon1>
        <icon2>
            .....
        </icon2>            
        .....
    </icons>
    

    洛伦佐

    推荐文章