Sdílet prostřednictvím


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í:

  1. Umožňuje přetažení prvku přidáním objektu DragGestureRecognizer do jeho GestureRecognizers kolekce. Další informace naleznete v tématu Povolení přetažení.
  2. [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.
  3. Povolte přetažení prvku přidáním objektu DropGestureRecognizer jeho GestureRecognizers kolekce. Další informace najdete v tématu Povolení přetažení.
  4. [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.
  5. [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, typu bool, 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 je true.
  • DragStartingCommand, typu ICommand, který se spustí při prvním rozpoznané gesto přetažení.
  • DragStartingCommandParameter, typu object, což je parametr, který je předán do DragStartingCommand.
  • DropCompletedCommand, typu ICommand, který se spustí při přetažení zdroje.
  • DropCompletedCommandParameter, typu object, což je parametr, který je předán do DropCompletedCommand.

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, typu booloznačuje, zda obslužná rutina události zpracovala událost nebo zda Xamarin.Forms má pokračovat ve vlastním zpracování.
  • Cancel, typu booloznačuje, zda má být událost zrušena.
  • Data, typu DataPackageoznač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:

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 boolpřevedeno na .string
DatePicker Date DateTimepřevedeno na .string
Editor Text
Entry Text
Label Text
RadioButton IsChecked boolpřevedeno na .string
Switch IsToggled boolpřevedeno na .string
TimePicker Time TimeSpanpř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, typu DataPackagePropertySet, což je kolekce vlastností, které tvoří data obsažená v sadě DataPackage. Tato vlastnost je jen pro čtení.
  • Image, typu ImageSource, což je obrázek obsažený v souboru DataPackage.
  • Text, typu string, což je text obsažený v sadě DataPackage.
  • View, typu DataPackageView, což je verze jen DataPackagepro č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 Pathobsluž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 Rectangleobsluž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 Rectangleklíč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, typu bool, 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 je true.
  • DragOverCommand, typu ICommand, který se spustí při přetažení zdroje přetáhnout přes cíl přetažení.
  • DragOverCommandParameter, typu object, což je parametr, který je předán do DragOverCommand.
  • DragLeaveCommand, typu ICommand, který se spustí při přetažení zdroje je přetažen z cíle přetažení.
  • DragLeaveCommandParameter, typu object, což je parametr, který je předán do DragLeaveCommand.
  • DropCommand, typu ICommand, který se spustí při přetažení zdroje přes cíl přetažení.
  • DropCommandParameter, typu object, což je parametr, který je předán do DropCommand.

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, DragLeavea 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, typu DataPackage, který obsahuje data přidružená ke zdroji přetažení. Tato vlastnost je jen ke čtení.
  • AcceptedOperation, typu DataPackageOperation, 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, typu DataPackageView, což je verze datového balíčku jen pro čtení.
  • Handled, typu booloznač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:

  • Noneoznačuje, že nebude provedena žádná akce.
  • Copyoznač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:

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 stringje převeden na .bool
DatePicker Date stringje převeden na .DateTime
Editor Text
Entry Text
Label Text
RadioButton IsChecked stringje převeden na .bool
Switch IsToggled stringje převeden na .bool
TimePicker Time stringje 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ě.