Поделиться через


Обзор поведения мыши при перетаскивании (Windows Forms .NET)

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

События перетаскивания

С операцией перетаскивания связаны две категории событий: события, возникающие в текущем целевом объекте операции перетаскивания, и события, возникающие в ее исходном объекте. Для выполнения операций перетаскивания эти события должны быть обработаны. Работая со сведениями, доступными через аргументы этих событий, можно значительно упростить операции перетаскивания.

События в текущем целевом объекте операции перетаскивания

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

Событие мыши Description
DragEnter Это событие происходит при перетаскивании объекта внутрь границ элемента управления. Обработчик этого события принимает аргумент типа DragEventArgs.
DragOver Это событие происходит при перетаскивании объекта, пока указатель мыши находится в пределах границ элемента управления. Обработчик этого события принимает аргумент типа DragEventArgs.
DragDrop Это событие происходит при завершении операции перетаскивания. Обработчик этого события принимает аргумент типа DragEventArgs.
DragLeave Это событие возникает при перемещении объекта за границы элемента управления. Обработчик этого события принимает аргумент типа EventArgs.

В классе DragEventArgs содержится расположение указателя мыши, текущее состояние кнопок мыши и клавиш-модификаторов, перетаскиваемые данные и значения DragDropEffects, указывающие, какие операции допускаются источником события перетаскивания, и результат операции перетаскивания в целевой объект.

События в исходном объекте операции перетаскивания

В таблице ниже приведены события, возникающие в исходном объекте операции перетаскивания.

Событие мыши Description
GiveFeedback Это событие возникает во время операции перетаскивания. Оно позволяет дать пользователю визуальную подсказку о том, что происходит операция перетаскивания, в виде, например, изменения указателя мыши. Обработчик этого события принимает аргумент типа GiveFeedbackEventArgs.
QueryContinueDrag Это событие возникает во время операции перетаскивания и позволяет исходному объекту определить, следует ли отменить эту операцию. Обработчик этого события принимает аргумент типа QueryContinueDragEventArgs.

В классе QueryContinueDragEventArgs содержится текущее состояние кнопок мыши и клавиш-модификаторов, значение, указывающее, была ли нажата клавиша ESC, и значение DragAction, с помощью которого можно указать, следует ли продолжать операцию перетаскивания.

Выполнение операции перетаскивания

Операции перетаскивания всегда используют два компонента: исходный объект операции перетаскивания и целевой объект операции перетаскивания. Чтобы начать операцию перетаскивания, назначьте элемент управления в качестве источника и обработайте событие MouseDown. В обработчике событий вызовите метод DoDragDrop, предоставив данные, связанные с перетаскиванием, и значение DragDropEffects.

Задайте для свойства AllowDrop целевого элемента управления значение true, чтобы разрешить этому элементу управления принимать операцию перетаскивания. Целевой объект обрабатывает два события, сначала событие в ответ на перетаскивание элемента управления, например DragOver. Затем событие, которое является самим действием перетаскивания, DragDrop.

В следующем примере демонстрируется перетаскивание из элемента управления Label в TextBox. По завершении перетаскивания TextBox отвечает, назначая текст метки самому себе.

// Initiate the drag
private void label1_MouseDown(object sender, MouseEventArgs e) =>
    DoDragDrop(((Label)sender).Text, DragDropEffects.All);

// Set the effect filter and allow the drop on this control
private void textBox1_DragOver(object sender, DragEventArgs e) =>
    e.Effect = DragDropEffects.All;

// React to the drop on this control
private void textBox1_DragDrop(object sender, DragEventArgs e) =>
    textBox1.Text = (string)e.Data.GetData(typeof(string));
' Initiate the drag
Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs)
    DoDragDrop(DirectCast(sender, Label).Text, DragDropEffects.All)
End Sub

' Set the effect filter and allow the drop on this control
Private Sub TextBox1_DragOver(sender As Object, e As DragEventArgs)
    e.Effect = DragDropEffects.All
End Sub

' React to the drop on this control
Private Sub TextBox1_DragDrop(sender As Object, e As DragEventArgs)
    TextBox1.Text = e.Data.GetData(GetType(String))
End Sub

Дополнительные сведения об эффектах перетаскивания см. в разделах Data и AllowedEffect.

См. также