Cenni preliminari sul trascinamento della selezione

In questo argomento vengono fornite informazioni generali sul trascinamento della selezione nelle applicazioni Windows Presentation Foundation (WPF). Per trascinamento della selezione si intende comunemente il metodo di trasferimento dei dati che richiede l'utilizzo di un mouse, o di un altro dispositivo di puntamento, per selezionare uno o più oggetti, trascinarli in un punto desiderato di destinazione nell'user interface (UI) e rilasciarli.

Nel presente argomento sono contenute le seguenti sezioni.

  • Trascinamento della selezione in WPF
  • Trasferimento dei dati
  • Eventi di trascinamento della selezione
  • Implementazione del trascinamento della selezione
  • Esempio di trascinamento della selezione
  • Argomenti correlati

Trascinamento della selezione in WPF

Le operazioni di trascinamento della selezione implicano in genere due parti: l'origine dell'oggetto trascinato e la destinazione in cui viene rilasciato l'oggetto trascinato. L'origine di trascinamento e la destinazione di rilascio possono essere elementi dell'interfaccia utente nella stessa applicazione o in un'applicazione diversa.

Il tipo e il numero di oggetti che possono essere modificati tramite il trascinamento della selezione sono completamente arbitrari. Ad esempio, file, cartelle e selezioni di contenuto sono alcuni degli oggetti più comuni modificati tramite operazioni di trascinamento della selezione.

Le azioni eseguite durante un'operazione di trascinamento della selezione sono specifiche dell'applicazione e spesso variano in base al contesto. Ad esempio, il trascinamento di una selezione di file da una cartella a un'altra nello stesso dispositivo di archiviazione comporta lo spostamento dei file per impostazione predefinita, mentre il trascinamento di file da una condivisione Universal Naming Convention (UNC) a una cartella locale ne comporta la copia.

Le funzionalità di trascinamento della selezione offerte da WPF sono estremamente flessibili e personalizzabili per supportare una vasta gamma di scenari. Il trascinamento della selezione supporta la modifica degli oggetti all'interno di una singola applicazione o tra applicazioni diverse. È inoltre completamente supportato il trascinamento della selezione tra applicazioni WPF e altre applicazioni Windows.

In WPF qualsiasi oggetto UIElement o ContentElement può partecipare al trascinamento della selezione. Gli eventi e i metodi richiesti per le operazioni di trascinamento della selezione sono definiti nella classe DragDrop. Le classi UIElement e ContentElement contengono alias per gli eventi associati a DragDrop in modo che gli eventi vengano visualizzati nell'elenco dei membri della classe quando un oggetto UIElement o ContentElement viene ereditato come elemento di base. I gestori eventi associati a questi eventi sono associati all'evento associato a DragDrop sottostante e ricevono la stessa istanza di dati dell'evento. Per ulteriori informazioni, vedere l'evento UIElement.Drop.

Nota sulla sicurezzaNota sulla sicurezza

Il trascinamento della selezione OLE non funziona nell'area Internet.

Trasferimento dei dati

Il trascinamento della selezione fa parte dell'area più generale del trasferimento dei dati. Il trasferimento dei dati include il trascinamento della selezione e le operazioni di copia e incolla. Un'operazione di trascinamento della selezione è analoga a un'operazione di taglia e incolla o di copia e incolla, utilizzata per trasferire i dati da un oggetto a un altro o da un'applicazione a un'altra utilizzando gli appunti di sistema. Entrambi i tipi di operazione richiedono:

  • un oggetto di origine che fornisce i dati;

  • un modo per archiviare temporaneamente i dati trasferiti;

  • un oggetto di destinazione che riceve i dati.

In un'operazione di copia e incolla, vengono utilizzati gli Appunti del sistema per archiviare temporaneamente i dati trasferiti. In un'operazione di trascinamento della selezione, si utilizza un oggetto DataObject per archiviare i dati. Concettualmente, un oggetto dati è costituito da una o più coppie di un oggetto Object che contiene i dati effettivi e di un identificatore di formato dati corrispondente.

L'origine di trascinamento avvia un'operazione di trascinamento della selezione chiamando un metodo DragDrop.DoDragDrop statico e passando a esso i dati trasferiti. Se necessario, il metodo DoDragDrop esegue automaticamente il wrapping dei dati in un oggetto DataObject. Per maggiore controllo sul formato dei dati, è possibile eseguire il wrapping dei dati in un oggetto DataObject prima di passarli al metodo DoDragDrop. La destinazione di rilascio è responsabile dell'estrazione dei dati da DataObject. Per ulteriori informazioni sull'utilizzo di oggetti dati, vedere Dati e oggetti dati.

Origine e destinazione dell'operazione di trascinamento della selezione sono elementi dell'interfaccia utente. Tuttavia, i dati effettivamente trasferiti non hanno in genere una rappresentazione visiva. È possibile scrivere codice per fornire una rappresentazione visiva dei dati trascinati, come accade quando si trascinano i file in Esplora risorse. Per impostazione predefinita, vengono fornite all'utente informazioni modificando il cursore in modo da rappresentare l'effetto che l'operazione di trascinamento della selezione avrà sui dati, ad esempio se i dati verranno spostati o copiati.

Effetti del trascinamento della selezione

Le operazioni di trascinamento della selezione possono avere effetti diversi sui dati trasferiti. Ad esempio, è possibile copiare i dati oppure spostarli. In WPF è definita un'enumerazione DragDropEffects che è possibile utilizzare per specificare l'effetto dell'operazione di trascinamento. Nell'origine di trascinamento è possibile specificare gli effetti consentiti dall'origine nel metodo DoDragDrop. Nella destinazione di rilascio è possibile specificare l'effetto previsto per la destinazione nella proprietà Effects della classe DragEventArgs. Quando la destinazione di rilascio specifica l'effetto previsto nell'evento DragOver, tali informazioni vengono passate nuovamente all'origine di trascinamento nell'evento GiveFeedback. L'origine di trascinamento utilizza queste informazioni per informare l'utente dell'effetto sui dati previsto dalla destinazione di rilascio. Quando i dati vengono rilasciati, la destinazione di rilascio specifica l'effetto effettivo nell'evento Drop. Tali informazioni vengono passate nuovamente all'origine di trascinamento come valore restituito del metodo DoDragDrop. Se la destinazione di rilascio restituisce un effetto non incluso nell'elenco di allowedEffects delle origini di trascinamento, l'operazione di trascinamento della selezione viene annullata senza effettuare alcun trasferimento di dati.

È importante ricordare che in WPF i valori di DragDropEffects vengono utilizzati esclusivamente per fornire comunicazione tra l'origine di trascinamento e la destinazione di rilascio, indipendentemente dagli effetti dell'operazione di trascinamento della selezione. L'effetto reale dell'operazione di trascinamento della selezione dipende dal codice appropriato scritto nell'applicazione.

Ad esempio, è possibile che la destinazione di trascinamento specifichi che l'effetto del rilascio dei dati in tale destinazione sia lo spostamento dei dati. Tuttavia, per effettuare lo spostamento, è necessario che i dati vengano aggiunti all'elemento di destinazione e rimossi dall'elemento di origine. L'elemento di origine può indicare che consente lo spostamento dei dati, ma se non si fornisce il codice per la rimozione dei dati dall'elemento di origine, il risultato finale sarà la copia dei dati, non lo spostamento.

Eventi di trascinamento della selezione

Le operazioni di trascinamento supportano un modello basato sugli eventi. Sia l'origine del trascinamento sia la destinazione del rilascio utilizzano un insieme standard di eventi per la gestione delle operazioni di trascinamento. Nelle tabelle riportate di seguito vengono riepilogati gli eventi di trascinamento della selezione standard. Si tratta di eventi associati sulla classe DragDrop. Per ulteriori informazioni sugli eventi associati, vedere Cenni preliminari sugli eventi associati.

Eventi dell'origine di trascinamento

Evento

Riepilogo

[ E:System.Windows.DragDrop.GiveFeedback ]

Questo evento si verifica in modo continuo durante un'operazione di trascinamento della selezione e consente all'origine di trascinamento di fornire informazioni all'utente. Queste informazioni vengono comunemente fornite mediante la modifica dell'aspetto del puntatore del mouse per indicare gli effetti consentiti dalla destinazione di rilascio. Evento di bubbling.

[ E:System.Windows.DragDrop.QueryContinueDrag ]

Questo evento si verifica alla modifica dello stato della tastiera o del pulsante del mouse durante un'operazione di trascinamento della selezione e consente all'origine del rilascio di annullare l'operazione in base allo stato della tastiera o del pulsante. Evento di bubbling.

[ E:System.Windows.DragDrop.PreviewGiveFeedback ]

Versione di tunneling di GiveFeedback.

[ E:System.Windows.DragDrop.PreviewQueryContinueDrag ]

Versione di tunneling di QueryContinueDrag.

Eventi della destinazione del rilascio

Evento

Riepilogo

[ E:System.Windows.DragDrop.DragEnter ]

Questo evento si verifica quando un oggetto viene trascinato nei limiti della destinazione del rilascio. Evento di bubbling.

[ E:System.Windows.DragDrop.DragLeave ]

Questo evento si verifica quando un oggetto viene trascinato all'esterno dei limiti della destinazione del rilascio. Evento di bubbling.

[ E:System.Windows.DragDrop.DragOver ]

Questo evento si verifica in modo continuo quando un oggetto viene trascinato (spostato) nei limiti della destinazione del rilascio. Evento di bubbling.

[ E:System.Windows.DragDrop.Drop ]

Questo evento si verifica quando un oggetto viene rilasciato sulla destinazione del rilascio. Evento di bubbling.

[ E:System.Windows.DragDrop.PreviewDragEnter ]

Versione di tunneling di DragEnter.

[ E:System.Windows.DragDrop.PreviewDragLeave ]

Versione di tunneling di DragLeave.

[ E:System.Windows.DragDrop.PreviewDragOver ]

Versione di tunneling di DragOver.

[ E:System.Windows.DragDrop.PreviewDrop ]

Versione di tunneling di Drop.

Per gestire gli eventi di trascinamento della selezione per istanze di un oggetto, aggiungere gestori per gli eventi elencati nelle tabelle precedenti. Per gestire gli eventi di trascinamento della selezione a livello di classe, eseguire l'override dei metodi virtuali On*Event e On*PreviewEvent corrispondenti. Per ulteriori informazioni, vedere Gestione di classi di eventi indirizzati tramite le classi di base dei controlli.

Implementazione del trascinamento della selezione

Un elemento dell'interfaccia utente può essere un'origine di trascinamento, una destinazione di rilascio o entrambe. Per implementare il trascinamento della selezione di base, scrivere codice per avviare l'operazione di trascinamento della selezione e per elaborare i dati rilasciati. È possibile migliorare l'esperienza di trascinamento della selezione gestendo eventi facoltativi relativi.

Per implementare il trascinamento della selezione di base, completare le attività seguenti:

  • Identificare l'elemento che costituirà l'origine di trascinamento. Un'origine di trascinamento può essere un oggetto UIElement o ContentElement.

  • Creare un gestore dell'evento sull'origine di trascinamento che avvierà l'operazione di trascinamento della selezione. L'evento è in genere un evento MouseMove.

  • Nel gestore dell'evento dell'origine di trascinamento chiamare il metodo DoDragDrop per avviare l'operazione di trascinamento della selezione. Nella chiamata a DoDragDrop specificare l'origine di trascinamento, i dati da trasferire e gli effetti consentiti.

  • Identificare l'elemento che costituirà la destinazione di rilascio. Una destinazione di rilascio può essere un oggetto UIElement o ContentElement.

  • Nella destinazione di rilascio impostare la proprietà AllowDrop su true.

  • Nella destinazione di rilascio creare un gestore dell'evento Drop per elaborare i dati rilasciati.

  • Nel gestore dell'evento Drop estrarre i dati dall'oggetto DragEventArgs utilizzando i metodi GetDataPresent e GetData.

  • Nel gestore dell'evento Drop utilizzare i dati per eseguire l'operazione di trascinamento della selezione desiderata.

È possibile migliorare l'implementazione del trascinamento della selezione creando un oggetto DataObject personalizzato e gestendo gli eventi facoltativi dell'origine di trascinamento e della destinazione di rilascio, come illustrato nelle attività seguenti:

  • Per trasferire dati personalizzati o più elementi di dati, creare un oggetto DataObject da passare al metodo DoDragDrop.

  • Per eseguire azioni aggiuntive durante un trascinamento, gestire gli eventi DragEnter, DragEnter e DragEnter nella destinazione di rilascio.

  • Per modificare l'aspetto del puntatore del mouse, gestire l'evento GiveFeedback nell'origine di trascinamento.

  • Per modificare il modo in cui l'operazione di trascinamento della selezione viene annullata, gestire l'evento QueryContinueDrag nell'origine di trascinamento.

Esempio di trascinamento della selezione

In questa sezione viene descritto come implementare il trascinamento della selezione per un elemento Ellipse. Ellipse è sia un'origine di trascinamento sia una destinazione di rilascio. I dati trasferiti costituiscono la rappresentazione di stringa della proprietà Fill dell'ellisse. Nel codice XAML seguente vengono illustrati l'elemento Ellipse e gli eventi correlati di trascinamento della selezione che gestisce. Per la procedura completa di implementazione del trascinamento della selezione, vedere Procedura dettagliata: abilitare il trascinamento della selezione in un controllo utente.

Impostazione di un elemento come origine di trascinamento

Un oggetto che funge da origine di trascinamento è responsabile di:

  • identificare quando si verifica un trascinamento;

  • avviare l'operazione di trascinamento della selezione;

  • identificare i dati da trasferire;

  • specificare gli effetti che l'operazione di trascinamento della selezione può avere sui dati trasferiti.

L'origine di trascinamento può inoltre offrire informazioni all'utente relative alle azioni consentite (spostamento, copia, nessuna) e può annullare l'operazione di trascinamento della selezione in base a input aggiuntivo da parte dell'utente, ad esempio la pressione del tasto ESC durante il trascinamento.

È responsabilità dell'applicazione determinare quando si verifica un trascinamento e quindi avviare l'operazione di trascinamento della selezione chiamando il metodo DoDragDrop. In genere, questa operazione viene effettuata quando si verifica un evento MouseMove sull'elemento da trascinare con un pulsante del mouse premuto. Nell'esempio seguente viene illustrato come avviare un'operazione di trascinamento della selezione dal gestore dell'evento MouseMove di un elemento Ellipse per renderlo un'origine di trascinamento. I dati trasferiti costituiscono la rappresentazione di stringa della proprietà Fill dell'ellisse.

All'interno del gestore dell'evento MouseMove, chiamare il metodo DoDragDrop per avviare l'operazione di trascinamento della selezione. Il metodo DoDragDrop accetta tre parametri:

  • dragSource: riferimento all'oggetto di dipendenza origine dei dati trasferiti. Si tratta in genere dell'origine dell'evento MouseMove.

  • data: oggetto contenente i dati trasferiti, inclusi in un oggetto DataObject.

  • allowedEffects: uno dei valori di enumerazione DragDropEffects che specifica gli effetti consentiti dell'operazione di trascinamento della selezione.

È possibile passare nel parametro data qualsiasi oggetto serializzabile. Se i dati non sono ancora inclusi in un oggetto DataObject, verranno automaticamente inclusi in un nuovo oggetto DataObject. Per passare più elementi di dati, è necessario creare manualmente l'oggetto DataObject e passarlo al metodo DoDragDrop. Per ulteriori informazioni, vedere Dati e oggetti dati.

Il parametro allowedEffects è utilizzato per specificare le azioni sui dati trasferiti che l'origine di trascinamento consente alla destinazione di rilascio. I valori comuni per un'origine di trascinamento sono Copy, Move e All.

NotaNota

La destinazione di rilascio è inoltre in grado di specificare gli effetti previsti in risposta ai dati trascinati.Ad esempio, se la destinazione di rilascio non riconosce il tipo di dati che verrà rilasciato, può rifiutare tali dati mediante l'impostazione degli effetti consentiti su None.In genere questa operazione viene eseguita nel gestore dell'evento DragOver.

Un'origine di trascinamento può facoltativamente gestire gli eventi GiveFeedback e QueryContinueDrag. Questi eventi presentano gestori predefiniti che vengono utilizzati a meno che non si contrassegnino gli eventi come gestiti. In genere questi eventi vengono ignorati, a meno che non vi sia l'esigenza specifica di modificarne il comportamento predefinito.

L'evento GiveFeedback viene generato in modo continuo mentre viene trascinata l'origine di trascinamento. Il gestore predefinito per questo evento controlla se l'origine di trascinamento si trova su una destinazione di rilascio valida. In questo caso, controlla gli effetti consentiti della destinazione di rilascio. Quindi, fornisce informazioni all'utente finale relativamente agli effetti di rilascio consentiti. Questa operazione viene in genere effettuata modificando il cursore del mouse in un cursore di non trascinamento, di copia o di spostamento. Gestire questo evento solo se è necessario utilizzare cursori personalizzati per fornire informazioni all'utente. Se si gestisce questo evento, assicurarsi di contrassegnarlo come gestito affinché il gestore predefinito non esegua l'override del gestore utilizzato.

L'evento QueryContinueDrag viene generato in modo continuo mentre viene trascinata l'origine di trascinamento. È possibile gestire questo evento per determinare quale azione termina l'operazione di trascinamento della selezione in base allo stato dei tasti ESC, MAIUSC, CTRL e ALT, nonché allo stato dei pulsanti del mouse. Il gestore predefinito per questo evento annulla l'operazione di trascinamento della selezione se viene premuto il tasto ESC e rilascia i dati se viene rilasciato il pulsante del mouse.

Nota di avvisoAttenzione

Questi eventi vengono generati in modo continuo durante l'operazione di trascinamento della selezione.Pertanto, è opportuno evitare le attività a elevato utilizzo di risorse nei gestori degli eventi.Ad esempio, utilizzare un cursore memorizzato nella cache anziché creare un nuovo cursore ogni volta che viene generato un evento GiveFeedback.

Impostazione di un elemento come destinazione di rilascio

Un oggetto che funge da destinazione di rilascio è responsabile di:

  • specificare che si tratta di una destinazione di rilascio valida;

  • rispondere all'origine di trascinamento quando viene effettuato il trascinamento sulla destinazione;

  • controllare che i dati trasferiti presentino il formato che può ricevere;

  • elaborare i dati rilasciati.

Per specificare che un elemento è una destinazione di rilascio, impostarne la proprietà AllowDrop su true. Gli eventi di destinazione di rilascio verranno quindi generati sull'elemento in modo che sia possibile gestirli. Durante un'operazione di trascinamento, sulla destinazione di trascinamento si verifica la sequenza di eventi seguente:

  1. [ E:System.Windows.DragDrop.DragEnter ]

  2. [ E:System.Windows.DragDrop.DragOver ]

  3. DragLeave o Drop

L'evento DragEnter si verifica quando i dati vengono trascinati nei limiti della destinazione di rilascio. In genere si gestisce questo evento per fornire un'anteprima degli effetti dell'operazione di trascinamento della selezione, se appropriato per l'applicazione. Non impostare la proprietà DragEventArgs.Effects nell'evento DragEnter, poiché verrebbe sovrascritta nell'evento DragOver.

Nell'esempio seguente viene illustrato il gestore dell'evento DragEnter per un elemento Ellipse. Questo codice consente di visualizzare in anteprima gli effetti dell'operazione di trascinamento della selezione salvando il pennello Fill corrente. Quindi utilizza il metodo GetDataPresent per controllare se l'oggetto DataObject trascinato sull'ellisse contiene dati di stringa che è possibile convertire in un oggetto Brush. In questo caso, i dati vengono estratti utilizzando il metodo GetData. Vengono quindi convertiti in un oggetto Brush e applicati all'ellisse. La modifica viene ripristinata nel gestore dell'evento DragLeave. Se non è possibile convertire i dati in un oggetto Brush, non viene eseguita alcuna azione.

L'evento DragOver si verifica in modo continuo mentre i dati vengono trascinati sulla destinazione di rilascio. Questo evento è abbinato all'evento GiveFeedback sull'origine di trascinamento. Nel gestore dell'evento DragOver, si utilizzano in genere i metodi GetDataPresent e GetData per controllare se i dati trasferiti sono in un formato che la destinazione di rilascio può elaborare. È anche possibile controllare se è stato premuto un tasto di modifica che in genere indica se l'utente prevede un'azione di spostamento o di copia. Dopo l'esecuzione di questi controlli, impostare la proprietà DragEventArgs.Effects per notificare all'origine di trascinamento quale sarà l'effetto del rilascio dei dati. L'origine di trascinamento riceve queste informazioni negli argomenti dell'evento GiveFeedback e può impostare un cursore appropriato per fornire informazioni all'utente.

Nell'esempio seguente viene illustrato il gestore dell'evento DragOver per un elemento Ellipse. Questo codice consente di controllare se l'oggetto DataObject trascinato sull'ellisse contiene dati di stringa che è possibile convertire in un oggetto Brush. In questo caso, imposta la proprietà DragEventArgs.Effects su Copy. In questo modo si indica all'origine di trascinamento che è possibile copiare i dati nell'ellisse. Se non è possibile convertire i dati in un oggetto Brush, la proprietà DragEventArgs.Effects viene impostata su None. In questo modo si indica all'origine di trascinamento che l'ellisse non è una destinazione di trascinamento valida per i dati.

L'evento DragLeave si verifica quando i dati vengono trascinati fuori dal limite della destinazione senza essere rilasciati. Gestire questo evento per annullare ogni operazione effettuata nel gestore dell'evento DragEnter.

Nell'esempio seguente viene illustrato il gestore dell'evento DragLeave per un elemento Ellipse. Questo codice annulla l'anteprima eseguita nel gestore dell'evento DragEnter applicando l'oggetto Brush salvato all'ellisse.

L'evento Drop si verifica quando i dati vengono rilasciati sulla destinazione di trascinamento. Per impostazione predefinita, si verifica quando viene rilasciato il pulsante del mouse. Nel gestore dell'evento Drop, utilizzare il metodo GetData per estrarre i dati trasferiti dall'oggetto DataObject ed eseguire qualsiasi operazione di elaborazione dei dati richiesta dall'applicazione. L'evento Drop termina l'operazione di trascinamento della selezione.

Nell'esempio seguente viene illustrato il gestore dell'evento Drop per un elemento Ellipse. Questo codice applica gli effetti dell'operazione di trascinamento della selezione ed è simile al codice nel gestore dell'evento DragEnter. Consente di controllare se l'oggetto DataObject trascinato sull'ellisse contiene dati di stringa che è possibile convertire in un oggetto Brush. In questo caso, l'oggetto Brush viene applicato all'ellisse. Se non è possibile convertire i dati in un oggetto Brush, non viene eseguita alcuna azione.

Vedere anche

Riferimenti

Clipboard

Altre risorse

Procedura dettagliata: abilitare il trascinamento della selezione in un controllo utente

Procedure relative al trascinamento della selezione

Trascinamento della selezione

Cronologia delle modifiche

Data

Cronologia

Motivo

Aprile 2011

Argomento aggiornato.

Commenti e suggerimenti dei clienti.