Rozpoznawanie gestu przeciągania i upuszczania
Wieloplatformowy interfejs użytkownika aplikacji platformy .NET (.NET MAUI) do rozpoznawania gestów przeciągania i upuszczania umożliwia przeciąganie elementów i skojarzonych z nimi pakietów danych z jednej lokalizacji na ekranie do innej lokalizacji przy użyciu gestu ciągłego. Przeciąganie i upuszczanie może odbywać się w jednej aplikacji lub może być uruchamiane w jednej aplikacji i kończyć się w innej.
Źródło przeciągania, czyli element, na którym zainicjowano gest przeciągania, może dostarczać dane, które mają być przesyłane przez wypełnienie obiektu pakietu danych. Po zwolnieniu źródła przeciągania następuje upuszczanie. Obiekt docelowy upuszczania, który jest elementem pod źródłem przeciągania, a następnie przetwarza pakiet danych.
Proces włączania przeciągania i upuszczania w aplikacji jest następujący:
- Włącz przeciąganie elementu, dodając DragGestureRecognizer obiekt do kolekcji GestureRecognizers . Aby uzyskać więcej informacji, zobacz Włączanie przeciągania.
- [opcjonalnie] Tworzenie pakietu danych. Program .NET MAUI automatycznie wypełnia pakiet danych dla kontrolek obrazów i tekstu, ale w przypadku innego pakietu danych należy skonstruować własny pakiet danych. Aby uzyskać więcej informacji, zobacz Tworzenie pakietu danych.
- Włącz upuszczanie elementu przez dodanie DropGestureRecognizer obiektu do jego GestureRecognizers kolekcji. Aby uzyskać więcej informacji, zobacz Włączanie upuszczania.
- [opcjonalnie]
DropGestureRecognizer.DragOver
Obsłuż zdarzenie, aby wskazać typ operacji dozwolonej przez miejsce docelowe upuszczania. Aby uzyskać więcej informacji, zobacz Handle the DragOver event (Obsługa zdarzenia DragOver). - [opcjonalnie] Przetwórz pakiet danych, aby otrzymać porzuconą zawartość. Program .NET MAUI automatycznie pobiera dane obrazu i tekstu z pakietu danych, ale w przypadku innej zawartości należy przetworzyć pakiet danych. Aby uzyskać więcej informacji, zobacz Przetwarzanie pakietu danych.
Włącz przeciąganie
W programie .NET MAUI funkcja rozpoznawania gestów przeciągania jest dostarczana przez klasę DragGestureRecognizer . Ta klasa definiuje następujące właściwości:
- CanDrag, typu
bool
, który wskazuje, czy element, do którego jest dołączony aparat rozpoznawania gestów, może być źródłem przeciągania. Wartość domyślna tej właściwości totrue
. - DragStartingCommand, typu ICommand, który jest wykonywany po pierwszym rozpoznaniu gestu przeciągania.
- DragStartingCommandParameter, typu
object
, który jest parametrem przekazanym do .DragStartingCommand - DropCompletedCommand, typu ICommand, który jest wykonywany, gdy źródło przeciągania jest porzucone.
- DropCompletedCommandParameter, typu
object
, który jest parametrem przekazanym do .DropCompletedCommand
Te właściwości są wspierane przez BindableProperty obiekty, co oznacza, że mogą być obiektami docelowymi powiązań danych i stylizowanymi.
Klasa DragGestureRecognizer definiuje DragStarting DropCompleted również zdarzenia, które są uruchamiane, jeśli CanDrag właściwość ma wartość true
. DragGestureRecognizer Gdy obiekt wykryje gest przeciągania, wykonuje DragStartingCommand obiekt i wywołuje DragStarting zdarzenie. Następnie, gdy DragGestureRecognizer obiekt wykryje ukończenie gestu upuszczania, wykonuje DropCompletedCommand zdarzenie i wywołuje DropCompleted zdarzenie.
Obiekt DragStartingEventArgs , który towarzyszy DragStarting zdarzeniu, definiuje następujące właściwości:
- Cancel, typu
bool
, wskazuje, czy zdarzenie powinno zostać anulowane. - Data, typu DataPackage, wskazuje pakiet danych, który towarzyszy źródle przeciągania. Jest to właściwość tylko do odczytu.
- PlatformArgs, typu
PlatformDragStartingEventArgs?
, reprezentuje argumenty specyficzne dla platformy skojarzone ze zdarzeniem.
W systemie Android PlatformDragStartingEventArgs klasa definiuje następujące właściwości:
Sender
, typu View, reprezentuje widok natywny dołączony do zdarzenia.MotionEvent
, typu MotionEvent, reprezentuje zdarzenie zawierające informacje o stanie przeciągania i upuszczania.
Ponadto w systemie Android PlatformDragStartingEventArgs klasa definiuje następujące metody:
SetDragShadowBuilder
, który ustawia View.DragShadowBuilder parametr do użycia podczas przeciągania.SetClipData
, który ustawia parametr ClipData do użycia podczas przeciągania.SetLocalData
, który ustawia dane lokalne do użycia podczas przeciągania.SetDragFlags
, który ustawia DragFlags parametr do użycia podczas przeciągania.
Na przykład użyj SetClipData
metody , aby skojarzyć ClipData z przeciągniętym elementem:
void OnDragStarting(object sender, DragStartingEventArgs e)
{
#if ANDROID
string content = "insert your content here";
e.PlatformArgs.SetClipData(Android.Content.ClipData.NewPlainText("Drag data", content));
#endif
}
Obiekt DropCompletedEventArgs , który towarzyszy DropCompleted zdarzeniu definiuje PlatformArgs właściwość typu PlatformDropCompletedEventArgs?
, która reprezentuje argumenty specyficzne dla platformy skojarzone ze zdarzeniem.
W systemie Android PlatformDropCompletedEventArgs klasa definiuje następujące właściwości:
Poniższy przykład XAML przedstawia DragGestureRecognizer dołączony element do elementu Image:
<Image Source="monkeyface.png">
<Image.GestureRecognizers>
<DragGestureRecognizer />
</Image.GestureRecognizers>
</Image>
W tym przykładzie można zainicjować gest przeciągania w obiekcie Image.
Napiwek
Gest przeciągania jest inicjowany za pomocą długiego naciśnięcia, po którym następuje przeciąganie.
Tworzenie pakietu danych
Program .NET MAUI automatycznie skompiluje pakiet danych po zainicjowaniu przeciągania dla następujących kontrolek:
- Kontrolki tekstu. Wartości tekstowe można przeciągać z CheckBoxobiektów , , EntryLabelEditorRadioButtonDatePickerSwitch, i .TimePicker
- Kontrolki obrazu. Obrazy można przeciągać z Buttonkontrolek , Imagei ImageButton .
W poniższej tabeli przedstawiono właściwości odczytywane i wszelkie próby konwersji po zainicjowaniu przeciągania w kontrolce tekstu:
Kontrolka | Właściwości | Konwersja |
---|---|---|
CheckBox | IsChecked |
bool przekonwertowany na .string |
DatePicker | Date |
DateTime przekonwertowany na .string |
Editor | Text |
|
Entry | Text |
|
Label | Text |
|
RadioButton | IsChecked |
bool przekonwertowany na .string |
Switch | IsToggled |
bool przekonwertowany na .string |
TimePicker | Time |
TimeSpan przekonwertowany na .string |
W przypadku zawartości innej niż tekst i obrazy należy samodzielnie skompilować pakiet danych.
Pakiety danych są reprezentowane przez klasę DataPackage , która definiuje następujące właściwości:
- Properties, typu DataPackagePropertySet, który jest kolekcją właściwości, które składają się na dane zawarte w obiekcie DataPackage. Ta właściwość jest właściwością tylko do odczytu.
- Image, typu ImageSource, który jest obrazem zawartym w obiekcie DataPackage.
- Text, typu
string
, który jest tekstem zawartym w obiekcie DataPackage. - View, typu DataPackageView, który jest wersją tylko do odczytu elementu DataPackage.
Klasa DataPackagePropertySet reprezentuje torbę właściwości przechowywaną Dictionary<string,object>
jako . Aby uzyskać informacje o DataPackageView klasie, zobacz Przetwarzanie pakietu danych.
Przechowywanie danych obrazu lub tekstu
Dane obrazu lub tekstu można skojarzyć ze źródłem przeciągania, przechowując dane we DataPackage.Image
właściwości lub DataPackage.Text
. Możesz dodać dane w procedurze obsługi dla DragStarting zdarzenia.
W poniższym przykładzie XAML pokazano, DragGestureRecognizer że program obsługi dla zdarzenia DragStarting jest rejestrowany:
<Path Stroke="Black"
StrokeThickness="4">
<Path.GestureRecognizers>
<DragGestureRecognizer DragStarting="OnDragStarting" />
</Path.GestureRecognizers>
<Path.Data>
<!-- PathGeometry goes here -->
</Path.Data>
</Path>
W tym przykładzie obiekt DragGestureRecognizer jest dołączony do Path obiektu. Zdarzenie DragStarting jest zgłaszane po wykryciu gestu przeciągania na Pathobiekcie , który wykonuje program obsługi zdarzeń OnDragStarting
:
void OnDragStarting(object sender, DragStartingEventArgs e)
{
e.Data.Text = "My text data goes here";
}
Obiekt DragStartingEventArgs , który towarzyszy DragStarting zdarzeniu, ma Data
właściwość typu DataPackage. W tym przykładzie Text
właściwość DataPackage obiektu jest ustawiona string
na wartość . Następnie DataPackage można uzyskać dostęp do obiektu po upuszczaniu, aby pobrać element string
.
Przechowywanie danych w torbie właściwości
Wszystkie dane, w tym obrazy i tekst, mogą być skojarzone ze źródłem przeciągania, przechowując dane w kolekcji DataPackage.Properties
. Możesz dodać dane w procedurze obsługi dla DragStarting zdarzenia.
W poniższym przykładzie XAML pokazano, DragGestureRecognizer że program obsługi dla zdarzenia DragStarting jest rejestrowany:
<Rectangle Stroke="Red"
Fill="DarkBlue"
StrokeThickness="4"
HeightRequest="200"
WidthRequest="200">
<Rectangle.GestureRecognizers>
<DragGestureRecognizer DragStarting="OnDragStarting" />
</Rectangle.GestureRecognizers>
</Rectangle>
W tym przykładzie obiekt DragGestureRecognizer jest dołączony do Rectangle obiektu. Zdarzenie DragStarting jest zgłaszane po wykryciu gestu przeciągania na Rectangleobiekcie , który wykonuje program obsługi zdarzeń OnDragStarting
:
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));
}
Obiekt DragStartingEventArgs , który towarzyszy DragStarting zdarzeniu, ma Data
właściwość typu DataPackage. Kolekcja Properties
DataPackage obiektu, który jest kolekcją Dictionary<string, object>
, można zmodyfikować w celu przechowywania wszelkich wymaganych danych. W tym przykładzie Properties
słownik jest modyfikowany w celu przechowywania Square
obiektu reprezentującego rozmiar Rectangle klucza "Kwadrat".
Włącz upuszczanie
W programie .NET MAUI funkcja rozpoznawania gestów upuszczania jest dostarczana przez klasę DropGestureRecognizer . Ta klasa definiuje następujące właściwości:
- AllowDrop, typu
bool
, który wskazuje, czy element, do którego jest dołączony aparat rozpoznawania gestów, może być obiektem docelowym upuszczania. Wartość domyślna tej właściwości totrue
. - DragOverCommand, typu ICommand, który jest wykonywany, gdy źródło przeciągania jest przeciągane na obiekt docelowy upuszczania.
- DragOverCommandParameter, typu
object
, który jest parametrem przekazanym do .DragOverCommand
- DragLeaveCommand, typu ICommand, który jest wykonywany, gdy źródło przeciągania jest przeciągane z miejsca docelowego upuszczania.
- DragLeaveCommandParameter, typu
object
, który jest parametrem przekazanym do .DragLeaveCommand
- DropCommand, typu ICommand, który jest wykonywany, gdy źródło przeciągania jest porzucane przez obiekt docelowy upuszczania.
- DropCommandParameter, typu
object
, który jest parametrem przekazanym do .DropCommand
Te właściwości są wspierane przez BindableProperty obiekty, co oznacza, że mogą być obiektami docelowymi powiązań danych i stylizowanymi.
Klasa DropGestureRecognizer definiuje DragOverrównież zdarzenia , DragLeavei Drop , które są uruchamiane, jeśli AllowDrop właściwość ma wartość true
. DropGestureRecognizer Gdy element rozpozna źródło przeciągania nad obiektem docelowym upuszczania, wykonuje DragOverCommand zdarzenie i wywołuje jeDragOver. Następnie, jeśli źródło przeciągania jest przeciągane z miejsca docelowego upuszczania, DropGestureRecognizer polecenie wykonuje DragLeaveCommand i wywołuje DragLeave zdarzenie. Na koniec po rozpoznaniu DropGestureRecognizer gestu upuszczania nad obiektem docelowym upuszczania wykonuje DropCommand i wywołuje Drop zdarzenie.
Klasa DragEventArgs , która towarzyszy DragOver zdarzeń i DragLeave , definiuje następujące właściwości:
- Data, typu DataPackage, który zawiera dane skojarzone ze źródłem przeciągania. Ta właściwość jest tylko do odczytu.
- AcceptedOperation, typu DataPackageOperation, który określa, które operacje są dozwolone przez obiekt docelowy upuszczania.
- PlatformArgs, typu
PlatformDragEventArgs?
, reprezentuje argumenty specyficzne dla platformy skojarzone ze zdarzeniem.
W systemie Android PlatformDragEventArgs klasa definiuje następujące właściwości:
Aby uzyskać informacje na temat wyliczenia, zobacz Handle the DataPackageOperation DragOver event (Obsługa zdarzenia DragOver).
Klasa DropEventArgs , która towarzyszy Drop zdarzeniu, definiuje następujące właściwości:
- Data, typu DataPackageView, który jest wersją pakietu danych tylko do odczytu.
- Handled, typu
bool
, wskazuje, czy program obsługi zdarzeń obsłużył zdarzenie, czy też program .NET MAUI powinien kontynuować własne przetwarzanie. - PlatformArgs, typu
PlatformDropEventArgs?
, reprezentuje argumenty specyficzne dla platformy skojarzone ze zdarzeniem.
W systemie Android PlatformDropEventArgs klasa definiuje następujące właściwości:
Poniższy przykład XAML przedstawia DropGestureRecognizer dołączony element do elementu Image:
<Image BackgroundColor="Silver"
HeightRequest="300"
WidthRequest="250">
<Image.GestureRecognizers>
<DropGestureRecognizer />
</Image.GestureRecognizers>
</Image>
W tym przykładzie, gdy źródło przeciągania jest porzucane na Image cel upuszczania, źródło przeciągania zostanie skopiowane do miejsca docelowego upuszczania, jeśli źródło przeciągania jest ImageSource. Program .NET MAUI automatycznie kopiuje przeciągane obrazy i tekst do zgodnych celów upuszczania.
Obsługa zdarzenia DragOver
Zdarzenie DropGestureRecognizer.DragOver
można opcjonalnie obsłużyć, aby wskazać, który typ operacji jest dozwolony przez cel upuszczania. Dozwolone operacje można wskazać, ustawiając AcceptedOperation
właściwość typu DataPackageOperation, na DragEventArgs obiekcie, który towarzyszy DragOver zdarzeniu.
Wyliczenie DataPackageOperation definiuje następujące elementy członkowskie:
None
, wskazuje, że nie zostanie wykonana żadna akcja.Copy
, wskazuje, że zawartość źródłowa przeciągania zostanie skopiowana do miejsca docelowego upuszczania.
Ważne
Po utworzeniu DragEventArgs obiektu właściwość jest domyślnie ustawiona AcceptedOperation
na DataPackageOperation.Copy
.
W poniższym przykładzie XAML pokazano, DropGestureRecognizer że program obsługi dla zdarzenia DragOver jest rejestrowany:
<Image BackgroundColor="Silver"
HeightRequest="300"
WidthRequest="250">
<Image.GestureRecognizers>
<DropGestureRecognizer DragOver="OnDragOver" />
</Image.GestureRecognizers>
</Image>
W tym przykładzie obiekt DropGestureRecognizer jest dołączony do Image obiektu. Zdarzenie DragOver jest wywoływane, gdy źródło przeciągania jest przeciągane przez obiekt docelowy upuszczania, ale nie zostało porzucone, co powoduje wykonanie OnDragOver
programu obsługi zdarzeń:
void OnDragOver(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.None;
}
W tym przykładzie AcceptedOperation
DragEventArgs właściwość obiektu jest ustawiona na DataPackageOperation.None
wartość . Ta wartość gwarantuje, że nie zostanie podjęta żadna akcja, gdy źródło przeciągania zostanie porzucone przez obiekt docelowy upuszczania.
Przetwarzanie pakietu danych
Zdarzenie Drop jest zgłaszane, gdy źródło przeciągania jest zwalniane przez obiekt docelowy upuszczania. Program .NET MAUI automatycznie próbuje pobrać dane z pakietu danych, gdy źródło przeciągania zostanie porzucone na następujące kontrolki:
- Kontrolki tekstu. Wartości tekstowe można porzucić na CheckBoxobiektach , , DatePicker, LabelEditorEntry, RadioButton, , Switch, i TimePicker .
- Kontrolki obrazu. Obrazy można porzucać na Buttonkontrolki , Imagei ImageButton .
W poniższej tabeli przedstawiono właściwości ustawione i dowolną konwersję, która jest podejmowana, gdy źródło przeciągania opartego na tekście jest porzucane w kontrolce tekstu:
Kontrolka | Właściwości | Konwersja |
---|---|---|
CheckBox | IsChecked |
string element jest konwertowany na element bool . |
DatePicker | Date |
string element jest konwertowany na element DateTime . |
Editor | Text |
|
Entry | Text |
|
Label | Text |
|
RadioButton | IsChecked |
string element jest konwertowany na element bool . |
Switch | IsToggled |
string element jest konwertowany na element bool . |
TimePicker | Time |
string element jest konwertowany na element TimeSpan . |
W przypadku zawartości innego niż tekst i obrazy należy samodzielnie przetworzyć pakiet danych.
Klasa DropEventArgs , która towarzyszy Drop zdarzeniu definiuje Data
właściwość typu DataPackageView. Ta właściwość reprezentuje wersję pakietu danych tylko do odczytu.
Pobieranie danych obrazu lub tekstu
Dane obrazu lub tekstu można pobrać z pakietu danych w procedurze obsługi zdarzenia Drop przy użyciu metod zdefiniowanych w DataPackageView klasie.
Klasa DataPackageView zawiera GetImageAsync
metody i GetTextAsync
. Metoda GetImageAsync
pobiera obraz z pakietu danych przechowywanego DataPackage.Image
we właściwości i zwraca wartość Task<ImageSource>
. GetTextAsync
Podobnie metoda pobiera tekst z pakietu danych przechowywanego DataPackage.Text
we właściwości i zwraca wartość Task<string>
.
W poniższym przykładzie przedstawiono procedurę obsługi zdarzeń Drop
, która pobiera tekst z pakietu danych dla elementu Path:
async void OnDrop(object sender, DropEventArgs e)
{
string text = await e.Data.GetTextAsync();
// Perform logic to take action based on the text value.
}
W tym przykładzie dane tekstowe są pobierane z pakietu danych przy użyciu GetTextAsync
metody . Następnie można wykonać akcję opartą na wartości tekstowej.
Pobieranie danych z torby właściwości
Wszystkie dane można pobrać z pakietu danych w procedurze obsługi zdarzenia Drop , korzystając Properties
z kolekcji pakietu danych.
Klasa DataPackageView definiuje Properties
właściwość typu DataPackagePropertySetView
. Klasa DataPackagePropertySetView
reprezentuje torbę właściwości tylko do odczytu przechowywaną Dictionary<string, object>
jako .
Poniższy przykład przedstawia procedurę Drop obsługi zdarzeń, która pobiera dane z torby właściwości pakietu danych dla elementu Rectangle:
void OnDrop(object sender, DropEventArgs e)
{
Square square = (Square)e.Data.Properties["Square"];
// Perform logic to take action based on retrieved value.
}
W tym przykładzie Square
obiekt jest pobierany z torby właściwości pakietu danych, określając klucz słownika "Square". Następnie można wykonać akcję opartą na pobranej wartości.
Przeciąganie i upuszczanie między aplikacjami
W systemach iOS, Mac Catalyst i Windows przeciągnięcie może rozpocząć się w jednej aplikacji z odpowiednią operacją upuszczania kończącą się w aplikacji .NET MAUI. Aplikacja, z której element jest przeciągany, to aplikacja źródłowa, a aplikacja .NET MAUI, na której jest porzucony element, jest aplikacją docelową.
Nie można przeciągać z aplikacji źródłowej do aplikacji docelowej .NET MAUI w systemie Android.
Uzyskiwanie położenia gestu
Położenie, w którym wystąpił gest przeciągania lub upuszczania, można uzyskać, wywołując metodę GetPosition DragEventArgsw obiekcie , DragStartingEventArgslub DropEventArgs . Metoda GetPosition akceptuje Element?
argument i zwraca pozycję jako Point?
obiekt:
void OnDragStarting(object sender, DragStartingEventArgs e)
{
// Position relative to screen
Point? screenPosition = e.GetPosition(null);
// Position relative to specified element
Point? relativeToImagePosition = e.GetPosition(image);
}
Argument Element?
definiuje element, z który należy uzyskać pozycję względem. Podanie wartości jako tego argumentu null
oznacza, że GetPosition metoda zwraca Point?
obiekt, który definiuje położenie gestu przeciągania lub upuszczania względem ekranu.