Aggiungere i riconoscitori movimenti di trascinamento della selezione
Un movimento di trascinamento della selezione consente di trascinare gli elementi e i relativi pacchetti di dati associati da una posizione sullo schermo a un'altra posizione usando un movimento continuo. Il trascinamento della selezione può essere eseguito in una singola applicazione oppure può iniziare in un'applicazione e terminare in un'altra.
Importante
Il riconoscimento dei movimenti di trascinamento della selezione è supportato in iOS, Android e nelle piattaforma UWP (Universal Windows Platform) (UWP). Tuttavia, in iOS è necessaria una piattaforma minima di iOS 11.
L'origine di trascinamento, ovvero l'elemento in cui viene avviato il movimento di trascinamento, può fornire i dati da trasferire popolando un oggetto pacchetto dati. Quando viene rilasciata l'origine di trascinamento, si verifica la selezione. Destinazione di rilascio, che è l'elemento sotto l'origine di trascinamento, quindi elabora il pacchetto di dati.
Il processo di abilitazione del trascinamento della selezione in un'applicazione è il seguente:
- Abilitare il trascinamento su un elemento aggiungendo un
DragGestureRecognizer
oggetto alla relativaGestureRecognizers
raccolta. Per altre informazioni, vedere Abilitare il trascinamento. - [facoltativo] Creare un pacchetto di dati. Xamarin.Forms popola automaticamente il pacchetto di dati per i controlli immagine e testo, ma per altri contenuti è necessario costruire un pacchetto di dati personalizzato. Per altre informazioni, vedere Creare un pacchetto di dati.
- Abilitare l'eliminazione su un elemento aggiungendo un
DropGestureRecognizer
oggetto alla relativaGestureRecognizers
raccolta. Per altre informazioni, vedere Abilitare l'eliminazione. - [facoltativo] Gestire l'evento
DropGestureRecognizer.DragOver
per indicare il tipo di operazione consentito dalla destinazione di rilascio. Per altre informazioni, vedere Gestire l'evento DragOver. - [facoltativo] Elaborare il pacchetto di dati per ricevere il contenuto eliminato. Xamarin.Forms recupererà automaticamente i dati di immagine e testo dal pacchetto di dati, ma per altri contenuti sarà necessario elaborare il pacchetto di dati. Per altre informazioni, vedere Elaborare il pacchetto di dati.
Nota
Il trascinamento di elementi da e verso un CollectionView
oggetto non è attualmente supportato.
Abilita trascinamento
In Xamarin.Formsil riconoscimento dei DragGestureRecognizer
movimenti di trascinamento viene fornito dalla classe . Questa classe definisce le proprietà seguenti:
CanDrag
, di tipobool
, che indica se l'elemento a cui è associato il riconoscimento movimento può essere un'origine di trascinamento. Il valore predefinito di questa proprietà ètrue
.DragStartingCommand
, di tipoICommand
, che viene eseguito quando viene riconosciuto per la prima volta un movimento di trascinamento.DragStartingCommandParameter
, di tipoobject
, ovvero il parametro passato aDragStartingCommand
.DropCompletedCommand
, di tipoICommand
, che viene eseguito quando viene eliminata l'origine di trascinamento.DropCompletedCommandParameter
, di tipoobject
, ovvero il parametro passato aDropCompletedCommand
.
Queste proprietà sono supportate da BindableProperty
oggetti, il che significa che possono essere destinazioni di data binding e stili.
La DragGestureRecognizer
classe definisce DragStarting
anche gli eventi e DropCompleted
che generano a condizione che la CanDrag
proprietà sia true
. Quando un DragGestureRecognizer
oggetto rileva un movimento di trascinamento, esegue DragStartingCommand
e richiama l'evento DragStarting
. Quindi, quando l'oggetto DragGestureRecognizer
rileva il completamento di un movimento di rilascio, esegue DropCompletedCommand
e richiama l'evento DropCompleted
.
L'oggetto DragStartingEventArgs
che accompagna l'evento DragStarting
definisce le proprietà seguenti:
Handled
, di tipobool
, indica se il gestore eventi ha gestito l'evento o se Xamarin.Forms deve continuare la propria elaborazione.Cancel
, di tipobool
, indica se l'evento deve essere annullato.Data
, di tipoDataPackage
, indica il pacchetto di dati che accompagna l'origine di trascinamento. Questa proprietà è di sola lettura.
L'esempio XAML seguente mostra un DragGestureRecognizer
oggetto associato a un oggetto Image
:
<Image Source="monkeyface.png">
<Image.GestureRecognizers>
<DragGestureRecognizer />
</Image.GestureRecognizers>
</Image>
In questo esempio, un movimento di trascinamento può essere avviato su Image
.
Suggerimento
In iOS, Android e UWP viene avviato un movimento di trascinamento con una pressione prolungata seguita da un trascinamento.
Creare un pacchetto di dati
Xamarin.Forms creerà automaticamente un pacchetto di dati quando viene avviato un trascinamento per i controlli seguenti:
- Controlli di testo. I valori di testo possono essere trascinati da
CheckBox
oggetti ,Editor
DatePicker
,Entry
,Switch
Label
RadioButton
, eTimePicker
. - Controlli immagine. Le immagini possono essere trascinate dai
Button
controlli ,Image
eImageButton
.
La tabella seguente mostra le proprietà lette e tutte le conversioni tentate, quando un trascinamento viene avviato in un controllo di testo:
Controllo | Proprietà | Conversione |
---|---|---|
CheckBox |
IsChecked |
bool convertito in un oggetto string . |
DatePicker |
Date |
DateTime convertito in un oggetto string . |
Editor |
Text |
|
Entry |
Text |
|
Label |
Text |
|
RadioButton |
IsChecked |
bool convertito in un oggetto string . |
Switch |
IsToggled |
bool convertito in un oggetto string . |
TimePicker |
Time |
TimeSpan convertito in un oggetto string . |
Per il contenuto diverso da testo e immagini, è necessario creare manualmente un pacchetto di dati.
I pacchetti di dati sono rappresentati dalla DataPackage
classe , che definisce le proprietà seguenti:
Properties
, di tipoDataPackagePropertySet
, che è una raccolta di proprietà che comprendono i dati contenuti inDataPackage
. Questa proprietà è una proprietà di sola lettura.Image
, di tipoImageSource
, che è l'immagine contenuta inDataPackage
.Text
, di tipostring
, che è il testo contenuto inDataPackage
.View
, di tipoDataPackageView
, che è una versione di sola lettura diDataPackage
.
La DataPackagePropertySet
classe rappresenta un contenitore di proprietà archiviato come .Dictionary<string,object>
Per informazioni sulla DataPackageView
classe, vedere Elaborare il pacchetto di dati.
Archiviare dati immagine o testo
I dati di immagine o testo possono essere associati a un'origine di trascinamento archiviando i dati nella DataPackage.Image
proprietà o DataPackage.Text
. Questa operazione può essere eseguita nel gestore per l'evento DragStarting
.
L'esempio XAML seguente mostra un DragGestureRecognizer
oggetto che registra un gestore per l'evento DragStarting
:
<Path Stroke="Black"
StrokeThickness="4">
<Path.GestureRecognizers>
<DragGestureRecognizer DragStarting="OnDragStarting" />
</Path.GestureRecognizers>
<Path.Data>
<!-- PathGeometry goes here -->
</Path.Data>
</Path>
In questo esempio l'oggetto DragGestureRecognizer
è associato a un Path
oggetto . L'evento DragStarting
viene generato quando viene rilevato un movimento di trascinamento in Path
, che esegue il OnDragStarting
gestore eventi:
void OnDragStarting(object sender, DragStartingEventArgs e)
{
e.Data.Text = "My text data goes here";
}
L'oggetto DragStartingEventArgs
che accompagna l'evento DragStarting
ha una Data
proprietà di tipo DataPackage
. In questo esempio la Text
proprietà dell'oggetto DataPackage
è impostata su un oggetto string
. È DataPackage
quindi possibile accedere all'oggetto all'eliminazione per recuperare l'oggetto string
.
Archiviare i dati nel contenitore delle proprietà
Tutti i dati, incluse immagini e testo, possono essere associati a un'origine di trascinamento archiviando i dati nella DataPackage.Properties
raccolta. Questa operazione può essere eseguita nel gestore per l'evento DragStarting
.
L'esempio XAML seguente mostra un DragGestureRecognizer
oggetto che registra un gestore per l'evento DragStarting
:
<Rectangle Stroke="Red"
Fill="DarkBlue"
StrokeThickness="4"
HeightRequest="200"
WidthRequest="200">
<Rectangle.GestureRecognizers>
<DragGestureRecognizer DragStarting="OnDragStarting" />
</Rectangle.GestureRecognizers>
</Rectangle>
In questo esempio l'oggetto DragGestureRecognizer
è associato a un Rectangle
oggetto . L'evento DragStarting
viene generato quando viene rilevato un movimento di trascinamento in Rectangle
, che esegue il OnDragStarting
gestore eventi:
void OnDragStarting(object sender, DragStartingEventArgs e)
{
Shape shape = (sender as Element).Parent as Shape;
e.Data.Properties.Add("Square", new Square(shape.Width, shape.Height));
}
L'oggetto DragStartingEventArgs
che accompagna l'evento DragStarting
ha una Data
proprietà di tipo DataPackage
. La Properties
raccolta dell'oggetto DataPackage
, che è una Dictionary<string, object>
raccolta, può essere modificata per archiviare i dati necessari. In questo esempio, il Properties
dizionario viene modificato per archiviare un Square
oggetto , che rappresenta le dimensioni di Rectangle
, rispetto a una chiave "Square".
Abilita rilascio
In Xamarin.Formsil riconoscimento del DropGestureRecognizer
movimento di rilascio viene fornito dalla classe . Questa classe definisce le proprietà seguenti:
AllowDrop
, di tipobool
, che indica se l'elemento a cui è associato il riconoscimento movimento può essere una destinazione di rilascio. Il valore predefinito di questa proprietà ètrue
.DragOverCommand
, di tipoICommand
, che viene eseguito quando l'origine di trascinamento viene trascinata sulla destinazione di rilascio.DragOverCommandParameter
, di tipoobject
, ovvero il parametro passato aDragOverCommand
.DragLeaveCommand
, di tipoICommand
, che viene eseguito quando l'origine di trascinamento viene trascinata dalla destinazione di rilascio.DragLeaveCommandParameter
, di tipoobject
, ovvero il parametro passato aDragLeaveCommand
.DropCommand
, di tipoICommand
, che viene eseguito quando l'origine di trascinamento viene rilasciata sulla destinazione di rilascio.DropCommandParameter
, di tipoobject
, ovvero il parametro passato aDropCommand
.
Queste proprietà sono supportate da BindableProperty
oggetti, il che significa che possono essere destinazioni di data binding e stili.
La DropGestureRecognizer
classe definisce DragOver
anche gli eventi , DragLeave
e Drop
che generano a condizione che la AllowDrop
proprietà sia true
. Quando un oggetto DropGestureRecognizer
riconosce un'origine di trascinamento sulla destinazione di rilascio, esegue DragOverCommand
e richiama l'evento DragOver
. Quindi, se l'origine di trascinamento viene trascinata dalla destinazione di rilascio, DropGestureRecognizer
esegue DragLeaveCommand
e richiama l'evento DragLeave
. Infine, quando riconosce DropGestureRecognizer
un movimento di rilascio sulla destinazione di rilascio, esegue DropCommand
e richiama l'evento Drop
.
La DragEventArgs
classe , che accompagna gli DragOver
eventi e DragLeave
, definisce le proprietà seguenti:
Data
, di tipoDataPackage
, che contiene i dati associati all'origine di trascinamento. Questa proprietà è di sola lettura.AcceptedOperation
, di tipoDataPackageOperation
, che specifica le operazioni consentite dalla destinazione di rilascio.
Per informazioni sull'enumerazione DataPackageOperation
, vedere Gestire l'evento DragOver.
La DropEventArgs
classe che accompagna l'evento Drop
definisce le proprietà seguenti:
Data
, di tipoDataPackageView
, che è una versione di sola lettura del pacchetto di dati.Handled
, di tipobool
, indica se il gestore eventi ha gestito l'evento o se Xamarin.Forms deve continuare la propria elaborazione.
L'esempio XAML seguente mostra un DropGestureRecognizer
oggetto associato a un oggetto Image
:
<Image BackgroundColor="Silver"
HeightRequest="300"
WidthRequest="250">
<Image.GestureRecognizers>
<DropGestureRecognizer />
</Image.GestureRecognizers>
</Image>
In questo esempio, quando viene rilasciata un'origine di trascinamento nella destinazione di Image
rilascio, l'origine di trascinamento verrà copiata nella destinazione di rilascio, purché l'origine di trascinamento sia un oggetto ImageSource
. Ciò si verifica perché Xamarin.Forms copia automaticamente le immagini trascinate e il testo in destinazioni di rilascio compatibili.
Gestire l'evento DragOver
L'evento DropGestureRecognizer.DragOver
può essere gestito facoltativamente per indicare il tipo di operazioni consentito dalla destinazione di rilascio. Questa operazione può essere eseguita impostando la AcceptedOperation
proprietà di tipo DataPackageOperation
, dell'oggetto che accompagna l'evento DragEventArgs
DragOver
.
L'enumerazione DataPackageOperation
definisce i membri seguenti:
None
, indica che non verrà eseguita alcuna azione.Copy
, indica che il contenuto dell'origine di trascinamento verrà copiato nella destinazione di rilascio.
Importante
Quando viene creato un DragEventArgs
oggetto, per impostazione predefinita la AcceptedOperation
proprietà è DataPackageOperation.Copy
.
L'esempio XAML seguente mostra un DropGestureRecognizer
oggetto che registra un gestore per l'evento DragOver
:
<Image BackgroundColor="Silver"
HeightRequest="300"
WidthRequest="250">
<Image.GestureRecognizers>
<DropGestureRecognizer DragOver="OnDragOver" />
</Image.GestureRecognizers>
</Image>
In questo esempio l'oggetto DropGestureRecognizer
è associato a un Image
oggetto . L'evento DragOver
viene generato quando un'origine di trascinamento viene trascinata sulla destinazione di rilascio, ma non è stata eliminata, che esegue il OnDragOver
gestore eventi:
void OnDragOver(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.None;
}
In questo esempio la AcceptedOperation
proprietà dell'oggetto DragEventArgs
è impostata su DataPackageOperation.None
. In questo modo non viene eseguita alcuna azione quando viene eliminata un'origine di trascinamento sulla destinazione di rilascio.
Elaborare il pacchetto di dati
L'evento Drop
viene generato quando viene rilasciata un'origine di trascinamento su una destinazione di rilascio. In questo caso, Xamarin.Forms tenterà automaticamente di recuperare i dati dal pacchetto di dati, quando un'origine di trascinamento viene rilasciata nei controlli seguenti:
- Controlli di testo. I valori di testo possono essere eliminati in
CheckBox
oggetti ,Editor
DatePicker
,Entry
,RadioButton
Label
Switch
, e .TimePicker
- Controlli immagine. Le immagini possono essere eliminate nei
Button
controlli ,Image
eImageButton
.
La tabella seguente mostra le proprietà impostate e tutte le conversioni tentate quando un'origine di trascinamento basata su testo viene eliminata in un controllo di testo:
Controllo | Proprietà | Conversione |
---|---|---|
CheckBox |
IsChecked |
string viene convertito in un oggetto bool . |
DatePicker |
Date |
string viene convertito in un oggetto DateTime . |
Editor |
Text |
|
Entry |
Text |
|
Label |
Text |
|
RadioButton |
IsChecked |
string viene convertito in un oggetto bool . |
Switch |
IsToggled |
string viene convertito in un oggetto bool . |
TimePicker |
Time |
string viene convertito in un oggetto TimeSpan . |
Per il contenuto diverso da testo e immagini, è necessario elaborare manualmente il pacchetto di dati.
La DropEventArgs
classe che accompagna l'evento Drop
definisce una Data
proprietà di tipo DataPackageView
. Questa proprietà rappresenta una versione di sola lettura del pacchetto di dati.
Recuperare dati di immagine o testo
I dati di immagine o testo possono essere recuperati da un pacchetto di dati nel gestore per l'evento Drop
, usando i metodi definiti nella DataPackageView
classe .
La DataPackageView
classe include GetImageAsync
metodi e GetTextAsync
. Il GetImageAsync
metodo recupera un'immagine dal pacchetto di dati, archiviata nella DataPackage.Image
proprietà e restituisce Task<ImageSource>
. Analogamente, il GetTextAsync
metodo recupera il testo dal pacchetto di dati, archiviato nella DataPackage.Text
proprietà e restituisce Task<string>
.
Nell'esempio seguente viene illustrato un Drop
gestore eventi che recupera il testo dal pacchetto di dati per un oggetto Path
:
async void OnDrop(object sender, DropEventArgs e)
{
string text = await e.Data.GetTextAsync();
// Perform logic to take action based on the text value.
}
In questo esempio, i dati di testo vengono recuperati dal pacchetto di dati usando il GetTextAsync
metodo . È quindi possibile eseguire un'azione basata sul valore di testo.
Recuperare dati dal contenitore delle proprietà
È possibile recuperare tutti i dati da un pacchetto di dati nel gestore per l'evento Drop
accedendo alla Properties
raccolta del pacchetto di dati.
La DataPackageView
classe definisce una Properties
proprietà di tipo DataPackagePropertySetView
. La DataPackagePropertySetView
classe rappresenta un contenitore di proprietà di sola lettura archiviato come .Dictionary<string, object>
L'esempio seguente mostra un Drop
gestore eventi che recupera i dati dal contenitore delle proprietà di un pacchetto di dati per un oggetto Rectangle
:
void OnDrop(object sender, DropEventArgs e)
{
Square square = (Square)e.Data.Properties["Square"];
// Perform logic to take action based on retrieved value.
}
In questo esempio l'oggetto Square
viene recuperato dal contenitore delle proprietà del pacchetto dati, specificando la chiave del dizionario "Square". È quindi possibile eseguire un'azione basata sul valore recuperato.