Обзор поведения мыши при перетаскивании (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.
См. также
.NET Desktop feedback