Přidání rozpoznávání gest přetažením
Gesto přetažení umožňuje položky a jejich přidružené datové balíčky přetáhnout z jednoho místa na obrazovce do jiného pomocí nepřetržitého gesta. Přetažení může probíhat v jedné aplikaci nebo může začínat v jedné aplikaci a končit jinou.
Důležité
Rozpoznávání gest přetažení je podporováno v systémech iOS, Android a Univerzální platforma Windows (UPW). Na iOSu se ale vyžaduje minimální platforma iOS 11.
Zdroj přetažení, což je prvek, na kterém je spuštěno gesto přetažení, může poskytnout data, která se mají přenést naplněním objektu datového balíčku. Po uvolnění zdroje přetažení dojde k přetažení. Cíl přetažení, který je prvkem pod zdrojem přetažení, pak zpracuje datový balíček.
Proces povolení přetažení v aplikaci je následující:
- Umožňuje přetažení prvku přidáním objektu
DragGestureRecognizer
do jehoGestureRecognizers
kolekce. Další informace naleznete v tématu Povolení přetažení. - [volitelné] Vytvoření datového balíčku Xamarin.Forms automaticky naplní datový balíček pro ovládací prvky obrázku a textu, ale pro další obsah budete muset vytvořit vlastní datový balíček. Další informace naleznete v tématu Sestavení datového balíčku.
- Povolte přetažení prvku přidáním objektu
DropGestureRecognizer
jehoGestureRecognizers
kolekce. Další informace najdete v tématu Povolení přetažení. - [volitelné]
DropGestureRecognizer.DragOver
Zpracujte událost a označte typ operace, kterou cíl vyřazuje. Další informace naleznete v tématu Zpracování události DragOver. - [volitelné] Zpracování datového balíčku pro příjem vyřazeného obsahu Xamarin.Forms automaticky načte obrázky a textová data z datového balíčku, ale pro další obsah budete muset datový balíček zpracovat. Další informace naleznete v tématu Zpracování datového balíčku.
Poznámka:
Přetažení položek do a z objektu je CollectionView
aktuálně nepodporované.
Povolit přetažení
Rozpoznávání Xamarin.Formsgest přetažením je poskytováno DragGestureRecognizer
třídou. Tato třída definuje následující vlastnosti:
CanDrag
, typubool
, který označuje, zda prvek rozpoznávání gest je připojen k může být zdroj přetažení. Výchozí hodnota této vlastnosti jetrue
.DragStartingCommand
, typuICommand
, který se spustí při prvním rozpoznané gesto přetažení.DragStartingCommandParameter
, typuobject
, což je parametr, který je předán doDragStartingCommand
.DropCompletedCommand
, typuICommand
, který se spustí při přetažení zdroje.DropCompletedCommandParameter
, typuobject
, což je parametr, který je předán doDropCompletedCommand
.
Tyto vlastnosti jsou podporovány BindableProperty
objekty, což znamená, že mohou být cíle datových vazeb a stylovány.
Třída DragGestureRecognizer
také definuje DragStarting
a DropCompleted
události, které se aktivují za předpokladu CanDrag
, že vlastnost je true
. DragGestureRecognizer
Když objekt zjistí gesto přetažení, spustí DragStartingCommand
a vyvolá DragStarting
událost. Když pak DragGestureRecognizer
objekt zjistí dokončení gesta přetažení, spustí DropCompletedCommand
a vyvolá DropCompleted
událost.
Objekt DragStartingEventArgs
, který doprovází DragStarting
událost, definuje následující vlastnosti:
Handled
, typubool
označuje, zda obslužná rutina události zpracovala událost nebo zda Xamarin.Forms má pokračovat ve vlastním zpracování.Cancel
, typubool
označuje, zda má být událost zrušena.Data
, typuDataPackage
označuje datový balíček, který doprovází zdroj přetažení. Toto je vlastnost jen pro čtení.
Následující příklad XAML ukazuje připojenou DragGestureRecognizer
k:Image
<Image Source="monkeyface.png">
<Image.GestureRecognizers>
<DragGestureRecognizer />
</Image.GestureRecognizers>
</Image>
V tomto příkladu lze gesto přetažení zahájit na .Image
Tip
V iOSu, Androidu a UPW se spustí gesto přetažení s dlouhým stisknutím a tažením.
Vytvoření datového balíčku
Xamarin.Forms automaticky sestaví datový balíček pro vás při spuštění přetažení pro následující ovládací prvky:
- Textové ovládací prvky. Textové hodnoty lze přetáhnout z
CheckBox
, ,DatePicker
,Editor
Entry
,Label
,RadioButton
, ,Switch
, aTimePicker
objektů. - Ovládací prvky obrázku Obrázky lze přetáhnout z
Button
,Image
aImageButton
ovládacích prvků.
V následující tabulce jsou uvedeny vlastnosti, které se čtou, a všechny pokusy o převod při přetažení na ovládací prvek textu:
Control | Vlastnost | Převod |
---|---|---|
CheckBox |
IsChecked |
bool převedeno na .string |
DatePicker |
Date |
DateTime převedeno na .string |
Editor |
Text |
|
Entry |
Text |
|
Label |
Text |
|
RadioButton |
IsChecked |
bool převedeno na .string |
Switch |
IsToggled |
bool převedeno na .string |
TimePicker |
Time |
TimeSpan převedeno na .string |
V případě jiného obsahu než textu a obrázků budete muset vytvořit datový balíček sami.
Datové balíčky jsou reprezentovány DataPackage
třídou, která definuje následující vlastnosti:
Properties
, typuDataPackagePropertySet
, což je kolekce vlastností, které tvoří data obsažená v saděDataPackage
. Tato vlastnost je jen pro čtení.Image
, typuImageSource
, což je obrázek obsažený v souboruDataPackage
.Text
, typustring
, což je text obsažený v saděDataPackage
.View
, typuDataPackageView
, což je verze jenDataPackage
pro čtení .
Třída DataPackagePropertySet
představuje tašku vlastností uloženou Dictionary<string,object>
jako . Informace o třídě naleznete v DataPackageView
tématu Zpracování datového balíčku.
Ukládání obrázků nebo textových dat
Obrázky nebo textová data lze přidružit ke zdroji přetažení uložením dat do objektu DataPackage.Image
nebo DataPackage.Text
vlastnosti. To lze provést v obslužné rutině DragStarting
události.
Následující příklad XAML ukazuje DragGestureRecognizer
, který zaregistruje obslužnou rutinu DragStarting
události:
<Path Stroke="Black"
StrokeThickness="4">
<Path.GestureRecognizers>
<DragGestureRecognizer DragStarting="OnDragStarting" />
</Path.GestureRecognizers>
<Path.Data>
<!-- PathGeometry goes here -->
</Path.Data>
</Path>
V tomto příkladu DragGestureRecognizer
je připojen k objektu Path
. Událost DragStarting
se aktivuje, když se zjistí gesto přetažení na Path
obslužné rutině OnDragStarting
události:
void OnDragStarting(object sender, DragStartingEventArgs e)
{
e.Data.Text = "My text data goes here";
}
Objekt DragStartingEventArgs
, který doprovází DragStarting
událost má Data
vlastnost typu DataPackage
. V tomto příkladu Text
je vlastnost objektu DataPackage
nastavena na hodnotu string
. K DataPackage
poté lze získat přístup při přetažení, aby bylo možné načíst string
.
Ukládání dat do tašky vlastností
Veškerá data, včetně obrázků a textu, lze přidružit ke zdroji přetažení uložením dat do DataPackage.Properties
kolekce. To lze provést v obslužné rutině DragStarting
události.
Následující příklad XAML ukazuje DragGestureRecognizer
, který zaregistruje obslužnou rutinu DragStarting
události:
<Rectangle Stroke="Red"
Fill="DarkBlue"
StrokeThickness="4"
HeightRequest="200"
WidthRequest="200">
<Rectangle.GestureRecognizers>
<DragGestureRecognizer DragStarting="OnDragStarting" />
</Rectangle.GestureRecognizers>
</Rectangle>
V tomto příkladu DragGestureRecognizer
je připojen k objektu Rectangle
. Událost DragStarting
se aktivuje, když se zjistí gesto přetažení na Rectangle
obslužné rutině OnDragStarting
události:
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));
}
Objekt DragStartingEventArgs
, který doprovází DragStarting
událost má Data
vlastnost typu DataPackage
. Kolekci Properties
objektu DataPackage
, což je Dictionary<string, object>
kolekce, lze upravit tak, aby ukládaly požadovaná data. V tomto příkladu Properties
se slovník upraví tak, aby ukládaný Square
objekt, který představuje velikost Rectangle
klíče "Square".
Povolit přetažení
Rozpoznávání Xamarin.Formsgest přetažení poskytuje DropGestureRecognizer
třída. Tato třída definuje následující vlastnosti:
AllowDrop
, typubool
, který označuje, zda prvek rozpoznávání gest je připojen k může být cíl přetažení. Výchozí hodnota této vlastnosti jetrue
.DragOverCommand
, typuICommand
, který se spustí při přetažení zdroje přetáhnout přes cíl přetažení.DragOverCommandParameter
, typuobject
, což je parametr, který je předán doDragOverCommand
.DragLeaveCommand
, typuICommand
, který se spustí při přetažení zdroje je přetažen z cíle přetažení.DragLeaveCommandParameter
, typuobject
, což je parametr, který je předán doDragLeaveCommand
.DropCommand
, typuICommand
, který se spustí při přetažení zdroje přes cíl přetažení.DropCommandParameter
, typuobject
, což je parametr, který je předán doDropCommand
.
Tyto vlastnosti jsou podporovány BindableProperty
objekty, což znamená, že mohou být cíle datových vazeb a stylovány.
Třída DropGestureRecognizer
také definuje DragOver
, DragLeave
a Drop
události, které se aktivují za předpokladu AllowDrop
, že vlastnost je true
. DropGestureRecognizer
Když rozpozná zdroj přetažení přes cíl přetažení, spustí DragOverCommand
a vyvolá DragOver
událost. Pokud je pak zdroj přetažení přetažen mimo cíl přetažení, DropGestureRecognizer
spustí DragLeaveCommand
událost a vyvolá ji DragLeave
. Nakonec, když DropGestureRecognizer
rozpozná gesto přetažení přes cíl přetažení, spustí DropCommand
a vyvolá Drop
událost.
Třída DragEventArgs
, která doprovází události DragOver
DragLeave
, definuje následující vlastnosti:
Data
, typuDataPackage
, který obsahuje data přidružená ke zdroji přetažení. Tato vlastnost je jen ke čtení.AcceptedOperation
, typuDataPackageOperation
, který určuje, které operace jsou povoleny cílem přetažení.
Informace o výčtu DataPackageOperation
naleznete v tématu Zpracování události DragOver.
Třída DropEventArgs
, která doprovází Drop
událost, definuje následující vlastnosti:
Data
, typuDataPackageView
, což je verze datového balíčku jen pro čtení.Handled
, typubool
označuje, zda obslužná rutina události zpracovala událost nebo zda Xamarin.Forms má pokračovat ve vlastním zpracování.
Následující příklad XAML ukazuje připojenou DropGestureRecognizer
k:Image
<Image BackgroundColor="Silver"
HeightRequest="300"
WidthRequest="250">
<Image.GestureRecognizers>
<DropGestureRecognizer />
</Image.GestureRecognizers>
</Image>
V tomto příkladu, když je zdroj přetažení na Image
cíl přetažení, bude zdroj přetažení zkopírován do cíle přetažení za předpokladu, že zdroj přetažení je ImageSource
. K tomu dochází, protože Xamarin.Forms automaticky kopíruje přetahované obrázky a text do kompatibilních cílů přetažení.
Zpracování události DragOver
Událost DropGestureRecognizer.DragOver
může být volitelně zpracována tak, aby označovala, jaký typ operací povoluje cíl odstranění. Toho lze dosáhnout nastavením AcceptedOperation
vlastnosti, typu DataPackageOperation
, DragEventArgs
objektu, který doprovází DragOver
událost.
Výčet DataPackageOperation
definuje následující členy:
None
označuje, že nebude provedena žádná akce.Copy
označuje, že se zdrojový obsah přetažení zkopíruje do cíle přetažení.
Důležité
Při vytvoření objektu DragEventArgs
je AcceptedOperation
vlastnost ve výchozím nastavení DataPackageOperation.Copy
.
Následující příklad XAML ukazuje DropGestureRecognizer
, který zaregistruje obslužnou rutinu DragOver
události:
<Image BackgroundColor="Silver"
HeightRequest="300"
WidthRequest="250">
<Image.GestureRecognizers>
<DropGestureRecognizer DragOver="OnDragOver" />
</Image.GestureRecognizers>
</Image>
V tomto příkladu DropGestureRecognizer
je připojen k objektu Image
. Událost DragOver
se aktivuje, když je zdroj přetažení přetažen přes cíl přetažení, ale nebyl vynechán, což spustí obslužnou rutinu OnDragOver
události:
void OnDragOver(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.None;
}
V tomto příkladu AcceptedOperation
je vlastnost objektu DragEventArgs
nastavena na DataPackageOperation.None
. Tím se zajistí, že při přetažení zdroje přes cíl přetažení nedojde k žádné akci.
Zpracování datového balíčku
Událost Drop
se aktivuje, když se zdroj přetažení uvolní přes cíl přetažení. Pokud k tomu dojde, Xamarin.Forms automaticky se pokusí načíst data z datového balíčku, když je zdroj přetažení na následující ovládací prvky:
- Textové ovládací prvky. Textové hodnoty lze přetáhnout na
CheckBox
, ,DatePicker
,Editor
Entry
,Label
,RadioButton
, , ,Switch
, aTimePicker
objekty. - Ovládací prvky obrázku Obrázky lze přetáhnout na
Button
,Image
aImageButton
ovládací prvky.
V následující tabulce jsou uvedeny vlastnosti, které jsou nastaveny, a všechny pokusy o převod, když textový zdroj přetažení na ovládací prvek textu vynechá:
Control | Vlastnost | Převod |
---|---|---|
CheckBox |
IsChecked |
string je převeden na .bool |
DatePicker |
Date |
string je převeden na .DateTime |
Editor |
Text |
|
Entry |
Text |
|
Label |
Text |
|
RadioButton |
IsChecked |
string je převeden na .bool |
Switch |
IsToggled |
string je převeden na .bool |
TimePicker |
Time |
string je převeden na .TimeSpan |
U jiného obsahu než textu a obrázků budete muset balíček dat zpracovat sami.
Třída DropEventArgs
, která doprovází Drop
událost definuje Data
vlastnost typu DataPackageView
. Tato vlastnost představuje verzi datového balíčku jen pro čtení.
Načtení obrázků nebo textových dat
Obrázky nebo textová data lze načíst z datového balíčku v obslužné rutině Drop
události pomocí metod definovaných DataPackageView
ve třídě.
Třída DataPackageView
obsahuje GetImageAsync
a GetTextAsync
metody. Metoda GetImageAsync
načte obrázek z datového balíčku, který byl uložen ve DataPackage.Image
vlastnosti, a vrátí Task<ImageSource>
. GetTextAsync
Podobně metoda načte text z datového balíčku, který byl uložen ve DataPackage.Text
vlastnosti a vrací Task<string>
.
Následující příklad ukazuje obslužnou rutinu Drop
události, která načte text z datového balíčku pro Path
:
async void OnDrop(object sender, DropEventArgs e)
{
string text = await e.Data.GetTextAsync();
// Perform logic to take action based on the text value.
}
V tomto příkladu se textová data načtou z datového balíčku pomocí GetTextAsync
metody. Pak můžete provést akci založenou na textové hodnotě.
Načtení dat z tašky vlastností
Všechna data lze načíst z datového balíčku v obslužné rutině Drop
události, a to přístupem ke Properties
kolekci datového balíčku.
Třída DataPackageView
definuje Properties
vlastnost typu DataPackagePropertySetView
. Třída DataPackagePropertySetView
představuje tašku vlastností jen pro čtení uloženou Dictionary<string, object>
jako .
Následující příklad ukazuje obslužnou rutinu Drop
události, která načte data z tašky vlastností datového balíčku pro Rectangle
:
void OnDrop(object sender, DropEventArgs e)
{
Square square = (Square)e.Data.Properties["Square"];
// Perform logic to take action based on retrieved value.
}
V tomto příkladu se Square
objekt načte z kontejneru vlastností datového balíčku zadáním klíče slovníku "Square". Pak lze provést akci založenou na načtené hodnotě.