Как разрешить пользователю перетаскивать динамически созданный элемент управления в место по своему выбору - PullRequest
11 голосов
/ 06 октября 2010

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

Теперь пользователь может переместить это текстовое поле в нужное место.Как мы делаем в Visual Studio.Одним из способов является получение нового местоположения путем получения значений от него с помощью текстового поля.Но я хочу, чтобы пользовательский интерфейс был простым.

Можем ли мы иметь такую ​​функциональность в winforms

Ответы [ 3 ]

22 голосов
/ 06 октября 2010

Я создал простую форму, которая демонстрирует, как перемещать элемент управления, перетаскивая элемент управления.В этом примере предполагается, что на форме, прикрепленной к соответствующему обработчику событий, есть кнопка с именем button1.

private Control activeControl;
private Point previousLocation;

private void button1_Click(object sender, EventArgs e)
{
    var textbox = new TextBox();
    textbox.Location = new Point(50, 50);
    textbox.MouseDown += new MouseEventHandler(textbox_MouseDown);
    textbox.MouseMove += new MouseEventHandler(textbox_MouseMove);
    textbox.MouseUp += new MouseEventHandler(textbox_MouseUp);

    this.Controls.Add(textbox);
}

void textbox_MouseDown(object sender, MouseEventArgs e)
{
    activeControl = sender as Control;
    previousLocation = e.Location;
    Cursor = Cursors.Hand;
}

void textbox_MouseMove(object sender, MouseEventArgs e)
{
    if (activeControl == null || activeControl != sender)
        return;

    var location = activeControl.Location;
    location.Offset(e.Location.X - previousLocation.X, e.Location.Y - previousLocation.Y);
    activeControl.Location = location;
}

void textbox_MouseUp(object sender, MouseEventArgs e)
{
    activeControl = null;
    Cursor = Cursors.Default;
}
1 голос
/ 11 апреля 2018

Это самый простой способ: сначала перейдите к названию вашего решения и щелкните правой кнопкой мыши. Выберите «Управление пакетами NuGet». Через некоторое время откроется окно с панелью поиска сверху. Выберите «Просмотр» и найдите пакет DraggableControl. Имя Control.Draggable должно быть видно. Нажмите на него, затем нажмите установить. Теперь вы можете использовать его специальные команды, например.

  private void button1_Click(object sender, EventArgs e)
    {   Point p = new Point(20,70 * i);
        RichTextBox tb = new RichTextBox();
        tb.Location = p;
        tb.Height= 60;
        tb.Width = 100;
        tb.Font = Normal;
        ControlExtension.Draggable(tb,true);
        this.Controls.Add(tb);
        i++;

Команда ControlExtension.Draggable может установить его как перетаскиваемый или нет. Просто напишите название объекта в скобках (tb для меня) и напишите запятую. Затем напишите, что оно перетаскивается (верно) или нет (ложно).

ПРИМЕЧАНИЕ: не забудьте поставить точку с запятой.

Надеюсь, это поможет.

Ссылка: https://www.nuget.org/packages/Control.Draggable/

1 голос
/ 06 октября 2010

Вы можете вызвать DoDragDrop с объектом данных, содержащим или представляющим элемент управления, чтобы начать операцию перетаскивания, затем обработать событие контейнера DragDrop и переместить элемент управления.

Если вы хотите увидеть элемент управлениякогда он перетаскивается, вы можете либо создать прозрачную (дескриптор WM_NCHITTEST) под мышью, показывающую элемент управления (вызов DrawToBitmap), либо вообще не использовать перетаскивание и перетаскивать и вместо этого обрабатывать события мыши и отслеживать состояние вручную.1008 * Если вам нужны линии привязки в стиле Visual Studio, вы можете сравнить границы элемента управления с другими элементами управления, создать набор линий для рисования и нарисовать их в событии рисования.

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