Evento Control.QueryContinueDrag
Aggiornamento: novembre 2007
Si verifica durante un'operazione di trascinamento e consente all'origine del trascinamento di determinare se l'operazione deve essere annullata.
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)
L'evento QueryContinueDrag viene generato quando avviene un cambiamento nello stato della tastiera o dei pulsanti del mouse durante un'operazione di trascinamento. L'evento QueryContinueDrag consente all'origine del trascinamento di determinare se l'operazione deve essere annullata.
Di seguito vengono illustrate le modalità e le circostanze in cui vengono generati eventi relativi a operazioni di trascinamento.
Il metodo DoDragDrop consente di determinare su quale controllo il cursore è correntemente posizionato. Quindi verifica se il controllo è una destinazione di trascinamento valida.
Se il controllo è una destinazione di trascinamento valida, l'evento GiveFeedback verrà generato con l'effetto di trascinamento specificato. Per un elenco degli effetti di trascinamento, vedere l'enumerazione DragDropEffects.
Viene tenuta traccia delle modifiche apportate alla posizione del cursore del mouse, allo stato della tastiera e allo stato dei pulsanti del mouse.
Se si sposta il cursore del mouse al di fuori di una finestra, viene generato un evento DragLeave.
Se il mouse viene spostato su un altro controllo, verrà generato l'evento DragEnter per questo controllo.
Se il mouse viene spostato ma sempre all'interno dello stesso controllo, verrà generato l'evento DragOver.
Se si verifica un cambiamento nello stato della tastiera o dei pulsanti del mouse, verrà generato l'evento QueryContinueDrag e verrà determinato se continuare l'operazione di trascinamento, rilasciare i dati o annullare l'operazione in base al valore della proprietà Action dell'evento QueryContinueDragEventArgs.
Se il valore di DragAction è Continue, viene generato l'evento DragOver per continuare l'operazione. Viene inoltre generato l'evento GiveFeedback con il nuovo effetto per consentire l'impostazione dell'azione visiva appropriata. Per un elenco degli effetti di trascinamento validi, vedere l'enumerazione DragDropEffects.
Nota:Gli eventi DragOver e GiveFeedback vengono abbinati in modo che, mentre il mouse viene spostato sulla destinazione di trascinamento, l'utente riceva le informazioni più aggiornate sulla posizione del mouse.
Se il valore di DragAction è Drop, il valore dell'effetto di rilascio viene restituito all'applicazione di origine, per consentire a quest'ultima di eseguire l'azione appropriata sui dati di origine, ad esempio il taglio dei dati in caso di un'operazione di spostamento.
Se il valore di DragAction è Cancel, viene generato l'evento DragLeave.
Per impostazione predefinita, l'evento QueryContinueDrag imposta la proprietà Action su Cancel nell'oggetto DragAction se viene premuto il tasto ESC e imposta la proprietà Action su Drop nell'oggetto DragAction se viene premuto il pulsante sinistro, centrale o destro del mouse.
Per ulteriori informazioni sulla gestione degli eventi, vedere Utilizzo degli eventi.
Nell'esempio di codice riportato di seguito viene illustrata un'operazione di trascinamento della selezione tra due controlli ListBox. Nell'esempio, all'avvio dell'azione di trascinamento viene chiamato il metodo DoDragDrop. L'azione di trascinamento viene avviata se il mouse viene spostato dalla posizione originaria di una distanza maggiore di quanto specificato da SystemInformation.DragSize durante l'evento MouseDown. Per determinare l'indice dell'elemento da trascinare durante l'evento MouseDown viene utilizzato il metodo IndexFromPoint.
Nell'esempio viene inoltre illustrato l'utilizzo di cursori personalizzati per le operazioni di trascinamento. Per eseguire l'esempio è necessario che nella directory dell'applicazione siano presenti due file cursore, 3dwarro.cur e 3dwno.cur, utilizzati rispettivamente per i cursori personalizzati relativi al trascinamento e al non rilascio. I cursori personalizzati vengono utilizzati se viene selezionato l'oggetto UseCustomCursorsCheck CheckBox. L'impostazione dei cursori personalizzati viene eseguita nel gestore eventi GiveFeedback.
Lo stato della tastiera viene valutato nel gestore eventi DragOver per l'oggetto ListBox di destra, per determinare l'operazione di trascinamento in base allo stato dei tasti MAIUSC, CTRL, ALT o CTRL+ALT. Durante l'evento DragOver viene inoltre determinato il punto all'interno dell'oggetto ListBox in cui si verificherà il rilascio. Se i dati da rilasciare non sono di tipo String, la proprietà DragEventArgs.Effect viene impostata su None in DragDropEffects. Infine, lo stato del trascinamento viene visualizzato in DropLocationLabel Label.
I dati da trascinare nell'oggetto ListBox di destra sono determinati nel gestore eventi DragDrop e il valore String viene aggiunto nella destinazione appropriata all'interno di ListBox. Se lo spostamento eseguito con l'operazione di trascinamento oltrepassa i limiti del form, l'operazione di trascinamento verrà annullata nel gestore eventi QueryContinueDrag.
Nella porzione di codice riportata di seguito viene illustrato l'utilizzo dell'evento QueryContinueDrag. Per l'esempio di codice completo, vedere il metodo DoDragDrop.
private void ListDragSource_QueryContinueDrag(object sender, System.Windows.Forms.QueryContinueDragEventArgs e) { // Cancel the drag if the mouse moves off the form. ListBox lb = sender as ListBox; if (lb != null) { Form f = lb.FindForm(); // Cancel the drag if the mouse moves off the form. The screenOffset // takes into account any desktop bands that may be at the top or left // side of the screen. if (((Control.MousePosition.X - screenOffset.X) < f.DesktopBounds.Left) || ((Control.MousePosition.X - screenOffset.X) > f.DesktopBounds.Right) || ((Control.MousePosition.Y - screenOffset.Y) < f.DesktopBounds.Top) || ((Control.MousePosition.Y - screenOffset.Y) > f.DesktopBounds.Bottom)) { e.Action = DragAction.Cancel; } } }
private void listDragSource_QueryContinueDrag(Object sender,
System.Windows.Forms.QueryContinueDragEventArgs e)
{
// Cancel the drag if the mouse moves off the form.
ListBox lb = (ListBox)sender;
if (lb != null) {
Form f = lb.FindForm();
// Cancel the drag if the mouse moves off the form. The
// screenOffset takes into account any desktop bands
// that may be at the top or left side of the screen.
if (Control.get_MousePosition().get_X() - screenOffset.get_X()
< f.get_DesktopBounds().get_Left()
|| Control.get_MousePosition().get_X()
- screenOffset.get_X() > f.get_DesktopBounds().get_Right()
|| Control.get_MousePosition().get_Y() - screenOffset.get_Y()
< f.get_DesktopBounds().get_Top()
|| Control.get_MousePosition().get_Y() - screenOffset.get_Y()
> f.get_DesktopBounds().get_Bottom()) {
e.set_Action(DragAction.Cancel);
}
}
} //listDragSource_QueryContinueDrag
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition , Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98
.NET Framework e .NET Compact Framework non supportano tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.