Sdílet prostřednictvím


Přidání rozpoznávání gest potáhnutí prstem

Gesto potáhnutí prstem nastane, když se prst přesune přes obrazovku vodorovným nebo svislým směrem a často se používá k zahájení navigace v obsahu.

Pokud chcete rozpoznat View gesto potáhnutí prstem, vytvořte SwipeGestureRecognizer instanci, nastavte Direction vlastnost na SwipeDirection hodnotu výčtu (Left, Right, Upnebo Down), volitelně nastavte Threshold vlastnost, zpracovat Swiped událost a přidat nový rozpoznávání gest do GestureRecognizers kolekce v zobrazení. Následující příklad kódu ukazuje připojenou SwipeGestureRecognizer k BoxView:

<BoxView Color="Teal" ...>
    <BoxView.GestureRecognizers>
        <SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
    </BoxView.GestureRecognizers>
</BoxView>

Tady je ekvivalentní kód jazyka C#:

var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left };
leftSwipeGesture.Swiped += OnSwiped;

boxView.GestureRecognizers.Add(leftSwipeGesture);

Třída SwipeGestureRecognizer také obsahuje Threshold vlastnost, která může být volitelně nastavena na uint hodnotu, která představuje minimální vzdálenost potáhnutí prstem, kterou je třeba dosáhnout pro rozpoznání potáhnutí prstem v jednotkách nezávislých na zařízení. Výchozí hodnota této vlastnosti je 100, což znamená, že všechny potáhnutí prsty, které jsou menší než 100 jednotek nezávislých na zařízení, budou ignorovány.

Rozpoznávání směru potáhnutí prstem

V příkladech výše Direction je vlastnost nastavena na jednu hodnotu z výčtu SwipeDirection . Je však také možné nastavit tuto vlastnost na více hodnot z výčtu SwipeDirection , aby Swiped se událost aktivovala v reakci na potáhnutí prstem ve více než jednom směru. Omezení však znamená, že jeden SwipeGestureRecognizer může rozpoznat pouze potáhnutí prsty, které se vyskytují na stejné ose. Proto lze potáhnutí prsty, ke kterým dochází na vodorovné ose, rozpoznat nastavením Direction vlastnosti na Left hodnotu a Right:

<SwipeGestureRecognizer Direction="Left,Right" Swiped="OnSwiped"/>

Podobně lze potáhnutí prsty, ke kterým dochází na svislé ose, rozpoznat nastavením Direction vlastnosti na Up :Down

var swipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Up | SwipeDirection.Down };

SwipeGestureRecognizer Případně můžete vytvořit pro každý směr potáhnutí prstem, který rozpozná potáhnutí prsty v každém směru:

<BoxView Color="Teal" ...>
    <BoxView.GestureRecognizers>
        <SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
        <SwipeGestureRecognizer Direction="Right" Swiped="OnSwiped"/>
        <SwipeGestureRecognizer Direction="Up" Swiped="OnSwiped"/>
        <SwipeGestureRecognizer Direction="Down" Swiped="OnSwiped"/>
    </BoxView.GestureRecognizers>
</BoxView>

Tady je ekvivalentní kód jazyka C#:

var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left };
leftSwipeGesture.Swiped += OnSwiped;
var rightSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Right };
rightSwipeGesture.Swiped += OnSwiped;
var upSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Up };
upSwipeGesture.Swiped += OnSwiped;
var downSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Down };
downSwipeGesture.Swiped += OnSwiped;

boxView.GestureRecognizers.Add(leftSwipeGesture);
boxView.GestureRecognizers.Add(rightSwipeGesture);
boxView.GestureRecognizers.Add(upSwipeGesture);
boxView.GestureRecognizers.Add(downSwipeGesture);

Poznámka:

V předchozích příkladech odpovídá stejná obslužná rutina události na Swiped aktivaci události. Každá SwipeGestureRecognizer instance však může v případě potřeby použít jinou obslužnou rutinu události.

Reakce na potažení prstem

Obslužná rutina události pro Swiped událost je zobrazena v následujícím příkladu:

void OnSwiped(object sender, SwipedEventArgs e)
{
    switch (e.Direction)
    {
        case SwipeDirection.Left:
            // Handle the swipe
            break;
        case SwipeDirection.Right:
            // Handle the swipe
            break;
        case SwipeDirection.Up:
            // Handle the swipe
            break;
        case SwipeDirection.Down:
            // Handle the swipe
            break;
    }
}

Můžete ji prozkoumat, abyste zjistili směr potáhnutí prstem. Vlastní SwipedEventArgs logika odpovídá na potáhnutí podle potřeby. Směr potáhnutí lze získat z Direction vlastnosti argumentů události, které budou nastaveny na jednu z hodnot výčtu SwipeDirection . Kromě toho argumenty události mají Parameter také vlastnost, která bude nastavena na hodnotu CommandParameter vlastnosti, pokud je definována.

Použití příkazů

Třída SwipeGestureRecognizer také obsahuje Command a CommandParameter vlastnosti. Tyto vlastnosti se obvykle používají v aplikacích, které používají model Model-View-ViewModel (MVVM). Vlastnost Command definuje ICommand , která má být vyvolána při rozpoznaném gestu potáhnutí prstem, s CommandParameter vlastností definující objekt, který se má předat do ICommand. následujícího příkladu kódu ukazuje, jak svázat Command vlastnost s definovanou ICommand v modelu zobrazení, jehož instance je nastavena jako stránka BindingContext:

var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left, CommandParameter = "Left" };
leftSwipeGesture.SetBinding(SwipeGestureRecognizer.CommandProperty, "SwipeCommand");
boxView.GestureRecognizers.Add(leftSwipeGesture);

Ekvivalentní kód XAML je:

<BoxView Color="Teal" ...>
    <BoxView.GestureRecognizers>
        <SwipeGestureRecognizer Direction="Left" Command="{Binding SwipeCommand}" CommandParameter="Left" />
    </BoxView.GestureRecognizers>
</BoxView>

SwipeCommand je vlastnost typu ICommand definovaná v instanci modelu zobrazení, která je nastavena jako stránka BindingContext. Když se rozpozná gesto potáhnutí prstem, Execute spustí se metoda objektu SwipeCommand . Argumentem metody Execute je hodnota CommandParameter vlastnosti. Další informace o příkazech naleznete v části Příkazové rozhraní.

Vytvoření kontejneru potáhnutí prstem

Třída SwipeContainer , která je znázorněna v následujícím příkladu kódu, je generalizovaná třída rozpoznávání potáhnutí prstem, která je zabalena kolem View provedení rozpoznávání gest potáhnutí prstem:

public class SwipeContainer : ContentView
{
    public event EventHandler<SwipedEventArgs> Swipe;

    public SwipeContainer()
    {
        GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Left));
        GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Right));
        GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Up));
        GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Down));
    }

    SwipeGestureRecognizer GetSwipeGestureRecognizer(SwipeDirection direction)
    {
        var swipe = new SwipeGestureRecognizer { Direction = direction };
        swipe.Swiped += (sender, e) => Swipe?.Invoke(this, e);
        return swipe;
    }
}

Třída SwipeContainer vytvoří SwipeGestureRecognizer objekty pro všechny čtyři směry potáhnutí prstem a připojí Swipe obslužné rutiny událostí. Tyto obslužné rutiny událostí vyvolávají Swipe událost definovanou objektem SwipeContainer.

Následující příklad kódu XAML ukazuje zabalení SwipeContainer třídy :BoxView

<ContentPage ...>
    <StackLayout>
        <local:SwipeContainer Swipe="OnSwiped" ...>
            <BoxView Color="Teal" ... />
        </local:SwipeContainer>
    </StackLayout>
</ContentPage>

Následující příklad kódu ukazuje, jak SwipeContainer se zalamuje na stránce jazyka BoxView C#:

public class SwipeContainerPageCS : ContentPage
{
    public SwipeContainerPageCS()
    {
        var boxView = new BoxView { Color = Color.Teal, ... };
        var swipeContainer = new SwipeContainer { Content = boxView, ... };
        swipeContainer.Swipe += (sender, e) =>
        {
          // Handle the swipe
        };

        Content = new StackLayout
        {
            Children = { swipeContainer }
        };
    }
}

BoxView Když obdrží gesto potáhnutí prstem, Swiped událost se SwipeGestureRecognizer aktivuje. To zpracovává SwipeContainer třída, která aktivuje vlastní Swipe událost. Tato Swipe událost se zpracovává na stránce. Pak SwipedEventArgs můžete prozkoumat směr potáhnutí prstem a podle potřeby reagovat na potáhnutí vlastní logikou.