.NET: есть ли элемент управления «как у рабочего стола» типа «щелкни и перетащи»? - PullRequest
2 голосов
/ 23 октября 2008

ОК, сначала для контекста посмотрите на рабочий стол Windows; Вы можете взять элементы (папки, файлы) на рабочем столе и перетащить их в разные места, и они «останутся» там, где вы их перетащили. Похоже, что это довольно полезная функция, предлагаемая пользователям, позволяющая им создавать свои собственные «группы» элементов.

Мой вопрос таков: Есть ли в .NET элемент управления, который приближает это поведение к коллекции элементов?

Я имею в виду что-то вроде списка в режиме «LargeIcon», но оно позволяет перетаскивать значки в разные места внутри элемента управления.

Ответы [ 5 ]

6 голосов
/ 24 октября 2008

Это можно сделать с помощью стандартного элемента управления 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 голос
/ 23 октября 2008

Если вы не против использования WPF, Джош Смит создал довольно аккуратный холст, который я сейчас использую для проекта. Это позволяет добавлять элементы управления и перетаскивать их по холсту. Вам придется обрабатывать то, что загружается на холст и где при следующей загрузке программы, но это довольно просто. http://www.codeproject.com/KB/WPF/DraggingElementsInCanvas.aspx

1 голос
/ 23 октября 2008

Это зависит от того, является ли это приложением Windows или приложением на основе веб-браузера. В любом случае вам нужен какой-то контейнер для управления расположением элементов управления. Вы можете управлять положением элементов управления внутри контейнера с помощью их координат X и Y.

Вы бы справились с фактическим движением, используя события перетаскивания. Таким образом, у вас есть начало перетаскивания при перетаскивании (вы можете отобразить графическое заполнитель или изменить курсор) и, наконец, конец перетаскивания (установите x и y элемента управления в новое положение). Очевидно, что это не настоящие имена событий, но поиск «как обрабатывать события перетаскивания» должен начать вас.

В веб-среде, я знаю, в jquery встроена возможность перетаскивания. Так что вы можете посмотреть на это. Одна большая вещь, с которой вам нужно быть осторожным, это поддерживать позиции вашего контроля между постбэками. Я не уверен, что произойдет в этом случае.

1 голос
/ 23 октября 2008

Я думаю, что наиболее близким будет элемент управления ListView, но даже это больше похоже на окно проводника. Возможно, вам удастся создать свой собственный вид, который будет делать то, что вы хотите, но вам нужно будет вручную сохранить расположение значков где-нибудь.

0 голосов
/ 03 мая 2016

Windows использует ListView32, внутренний элемент управления с функциями заполнения и перетаскивания, пользовательские границы ...

Расположение значка может быть сохранено в файле XML или в настройках приложения (путем помещения XML в виде строки и преобразования его в файл при необходимости).

Вы можете сделать, например:

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

Lorenzo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...