Partager via


TouchBehavior

Le TouchBehavior est Behavior qui offre la possibilité d’interagir avec tous les VisualElement en fonction d’événements tactiles, par clic de souris et pointage. L’implémentation de TouchBehavior permet de personnaliser différentes propriétés visuelles du VisualElement auquel il est attaché, comme BackgroundColor, Opacity, Rotation, Scale et bien d’autres.

Remarque

Le kit d’outils fournit également l’implémentation ImageTouchBehavior qui étend TouchBehavior en offrant la possibilité de personnaliser la Source d’un élément Image.

Important

Les comportements du Kit d’outils de la communauté .NET MAUI ne définissent pas le BindingContext d’un comportement, car ces comportements peuvent être partagés et appliqués à plusieurs contrôles par l’intermédiaire de styles. Pour obtenir plus d’informations, voir Comportements MAUI .NET

Syntaxe

Les exemples suivants montrent comment ajouter TouchBehavior à un HorizontalStackLayout parent et comment effectuer les animations suivantes lorsqu’un utilisateur touche HorizontalStackLayout ou l’un de ses enfants ou clique dessus :

  • S’anime sur une période de 250 millisecondes
  • applique le CubicInOut Easing
  • Remplace Opacity par 0.6
  • Remplace Scale par 0.8

XAML

Y compris l’espace de noms XAML

Pour utiliser le kit de ressources dans XAML, le xmlns suivant doit être ajouté à votre page ou à votre affichage :

xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"

Il en résulte ce qui suit :

<ContentPage
    x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">

</ContentPage>

Serait modifié pour inclure le xmlns de la manière suivante :

<ContentPage
    x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit">

</ContentPage>

Utilisation du TouchBehavior

<ContentPage 
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
    x:Class="CommunityToolkit.Maui.Sample.Pages.Behaviors.TouchBehaviorPage">

   <HorizontalStackLayout HorizontalOptions="Center" VerticalOptions="Center">
        <HorizontalStackLayout.Behaviors>
            <toolkit:TouchBehavior
                DefaultAnimationDuration="250"
                DefaultAnimationEasing="{x:Static Easing.CubicInOut}"
                PressedOpacity="0.6"
                PressedScale="0.8" />
        </HorizontalStackLayout.Behaviors>

        <ContentView
            HeightRequest="100"
            WidthRequest="10"
            BackgroundColor="Gold" />
        <Label Text="The entire layout receives touches" VerticalOptions="Center" LineBreakMode="TailTruncation"/>
        <ContentView
            HeightRequest="100"
            WidthRequest="10"
            BackgroundColor="Gold" />
    </HorizontalStackLayout>

</ContentPage>

C#

Le TouchBehavior peut être utilisé de la manière suivante dans C# :

class TouchBehaviorPage : ContentPage
{
    public TouchBehaviorPage()
    {
        var firstContent = new ContentView
        {
            HeightRequest = 100,
            WidthRequest = 10,
            BackgroundColor = Colors.Gold
        };

        var label = new Label
        {
            Text = "The entire layout receives touches",
            VerticalOptions = LayoutOptions.Center,
            LineBreakMode = LineBreakMode.TailTruncation
        };

        var secondContent = new ContentView
        {
            HeightRequest = 100,
            WidthRequest = 10,
            BackgroundColor = Colors.Gold
        };

        var layout = new HorizontalStackLayout
        {
            HorizontalOptions = LayoutOptions.Center,
            VerticalOptions = LayoutOptions.Center,
            Children = 
            {
                firstContent,
                label,
                secondContent
            }
        }

        var touchBehavior = new TouchBehavior
        {
            DefaultAnimationDuration = 250,
            DefaultAnimationEasing = Easing.CubicInOut,
            PressedOpacity = 0.6,
            PressedScale = 0.8
        };

        layout.Behaviors.Add(touchBehavior);

        Content = layout;
    }
}

Balisage C#

Notre package CommunityToolkit.Maui.Markup permet d’utiliser ce Behavior de manière beaucoup plus concise en C#.

using CommunityToolkit.Maui.Markup;

class TouchBehaviorPage : ContentPage
{
    public TouchBehaviorPage()
    {
        Content = new HorizontalStackLayout
        {
            HorizontalOptions = LayoutOptions.Center,
            VerticalOptions = LayoutOptions.Center,
            Children = 
            {
                new ContentView()
                    .Size(10, 100)
                    .BackgroundColor(Colors.Gold),

                new Label
                {
                    LineBreakMode = LineBreakMode.TailTruncation
                }
                    .Text("The entire layout receives touches"
                    .CenterVertical(),

                new ContentView()
                    .Size(10, 100)
                    .BackgroundColor(Colors.Gold)
            }
        }
            .Behaviors(new TouchBehavior
            {
                DefaultAnimationDuration = 250,
                DefaultAnimationEasing = Easing.CubicInOut,
                PressedOpacity = 0.6,
                PressedScale = 0.8
            });
    }
}

Exemples supplémentaires

Gestion de l’interaction par pointage

TouchBehavior permet de personnaliser les propriétés du VisualElement attaché selon que la souris pointe ou non sur l’élément.

L’exemple suivant montre comment attacher TouchBehavior à HorizontalStackLayout et comment modifier les propriétés BackgroundColor et Scale de HorizontalStackLayout lorsqu’un utilisateur pointe le curseur de sa souris sur la disposition et tout élément enfant.

<HorizontalStackLayout
    Padding="20"
    Background="Black"
    HorizontalOptions="Center">
    <HorizontalStackLayout.Behaviors>
        <toolkit:TouchBehavior
            HoveredBackgroundColor="{StaticResource Gray900}"
            HoveredScale="1.2" />
    </HorizontalStackLayout.Behaviors>
</HorizontalStackLayout>

Gestion de l’interaction par appui long

TouchBehavior permet de gérer les appuis de longue durée effectués par un utilisateur. Vous pouvez définir cette durée avec LongPressDuration qui est exprimé en millisecondes.

L’exemple suivant montre comment ajouter TouchBehavior à HorizontalStackLayout, lier LongPressCommand à IncreaseLongPressCountCommand défini dans le modèle de vue de stockage et définir LongPressDuration sur 750 millisecondes.

<HorizontalStackLayout
    Padding="20"
    Background="Black"
    HorizontalOptions="Center"
    x:Name="TouchableHorizontalStackLayout">
    <HorizontalStackLayout.Behaviors>
        <toolkit:TouchBehavior
            BindingContext="{Binding Source={x:Reference Page}, Path=BindingContext, x:DataType=ContentPage}"
            LongPressDuration="750"
            LongPressCommand="{Binding Source={x:Reference Page}, Path=BindingContext.IncreaseLongPressCountCommand, x:DataType=ContentPage}"/>
    </HorizontalStackLayout.Behaviors>
</HorizontalStackLayout>

Propriétés

Propriété Type Description
Commande ICommand Obtient ou définit l’ICommand à appeler à l’issue d’un mouvement tactile de l’utilisateur.
CommandParameter object Obtient ou définit le paramètre à passer à la propriété Command.
CurrentHoverState HoverState Obtient ou définit le HoverState actuel du comportement.
CurrentHoverStatus HoverStatus Obtient ou définit le HoverStatus actuel du comportement.
CurrentInteractionStatus TouchInteractionStatus Obtient ou définit le TouchInteractionStatus actuel du comportement.
CurrentTouchState TouchState Obtient ou définit le TouchState actuel du comportement.
CurrentTouchStatus TouchStatus Obtient ou définit le TouchStatus actuel du comportement.
DefaultAnimationDuration int Obtient ou définit la durée de l’animation lorsque la propriété CurrentTouchState est TouchState.Default.
DefaultAnimationEasing Easing Obtient ou définit l’accélération de l’animation lorsque la propriété CurrentTouchState est TouchState.Default.
DefaultBackgroundColor Color Obtient ou définit la couleur d’arrière-plan de l’élément lorsque la propriété CurrentTouchState est TouchState.Default.
DefaultOpacity double Obtient ou définit l’opacité de l’élément lorsque la propriété CurrentTouchState est TouchState.Default.
DefaultRotation double Obtient ou définit la rotation autour des axes X et Y de l’élément lorsque la propriété CurrentTouchState est TouchState.Default.
DefaultRotationX double Obtient ou définit la rotation autour de l’axe X de l’élément lorsque la propriété CurrentTouchState est TouchState.Default.
DefaultRotationY double Obtient ou définit la rotation autour de l’axe Y de l’élément lorsque la propriété CurrentTouchState est TouchState.Default.
DefaultScale double Obtient ou définit l’échelle de l’élément lorsque la propriété CurrentTouchState est TouchState.Default.
DefaultTranslationX double Obtient ou définit la translation X de l’élément lorsque la propriété CurrentTouchState est TouchState.Default.
DefaultTranslationY double Obtient ou définit la translation Y de l’élément lorsque la propriété CurrentTouchState est TouchState.Default.
DisallowTouchThreshold int Obtient ou définit le seuil après lequel l’interaction tactile n’est pas autorisée.
HoveredAnimationDuration int Obtient ou définit la durée de l’animation lorsque la propriété CurrentHoverState est HoverState.Hovered.
HoveredAnimationEasing Easing Obtient ou définit l’accélération de l’animation lorsque la propriété CurrentHoverState est HoverState.Hovered.
HoveredBackgroundColor Color Obtient ou définit la couleur d’arrière-plan de l’élément lorsque la propriété CurrentHoverState est HoverState.Hovered.
HoveredOpacity double Obtient ou définit l’opacité de l’élément lorsque la propriété CurrentHoverState est HoverState.Hovered.
HoveredRotation double Obtient ou définit la rotation autour des axes X et Y de l’élément lorsque la propriété CurrentHoverState est HoverState.Hovered.
HoveredRotationX double Obtient ou définit la rotation autour de l’axe X de l’élément lorsque la propriété CurrentHoverState est HoverState.Hovered.
HoveredRotationY double Obtient ou définit la rotation autour de l’axe Y de l’élément lorsque la propriété CurrentHoverState est HoverState.Hovered.
HoveredScale double Obtient ou définit l’échelle de l’élément lorsque la propriété CurrentHoverState est HoverState.Hovered.
HoveredTranslationX double Obtient ou définit la translation X de l’élément lorsque la propriété CurrentHoverState est HoverState.Hovered.
HoveredTranslationY double Obtient ou définit la translation Y de l’élément lorsque la propriété CurrentHoverState est HoverState.Hovered.
IsEnabled bool Obtient ou définit une valeur indiquant si le comportement est activé.
LongPressCommand ICommand Obtient ou définit l’ICommand à appeler à l’issue d’un appui long de l’utilisateur.
LongPressCommandParameter object Obtient ou définit le paramètre à passer à la propriété LongPressCommand.
LongPressDuration int Obtient ou définit la durée en millisecondes requise pour déclencher le mouvement d’appui long.
PressedAnimationDuration int Obtient ou définit la durée de l’animation lorsque la propriété CurrentTouchState est TouchState.Pressed.
PressedAnimationEasing Easing Obtient ou définit l’accélération de l’animation lorsque la propriété CurrentTouchState est TouchState.Pressed.
PressedBackgroundColor Color Obtient ou définit la couleur d’arrière-plan de l’élément lorsque la propriété CurrentTouchState est TouchState.Pressed.
PressedOpacity double Obtient ou définit l’opacité de l’élément lorsque la propriété CurrentTouchState est TouchState.Pressed.
PressedRotation double Obtient ou définit la rotation autour des axes X et Y de l’élément lorsque la propriété CurrentTouchState est TouchState.Pressed.
PressedRotationX double Obtient ou définit la rotation autour de l’axe X de l’élément lorsque la propriété CurrentTouchState est TouchState.Pressed.
PressedRotationY double Obtient ou définit la rotation autour de l’axe Y de l’élément lorsque la propriété CurrentTouchState est TouchState.Pressed.
PressedScale double Obtient ou définit l’échelle de l’élément lorsque la propriété CurrentTouchState est TouchState.Pressed.
PressedTranslationX double Obtient ou définit la translation X de l’élément lorsque la propriété CurrentTouchState est TouchState.Pressed.
PressedTranslationY double Obtient ou définit la translation Y de l’élément lorsque la propriété CurrentTouchState est TouchState.Pressed.
ShouldMakeChildrenInputTransparent bool Obtient ou définit une valeur indiquant si les enfants de l’élément doivent être rendus transparents en entrée.

Événements

Événement Description
CurrentTouchStateChanged Se déclenche lorsque CurrentTouchState change.
CurrentTouchStatusChanged Se déclenche lorsque CurrentTouchStatus change.
HoverStateChanged Se déclenche lorsque CurrentHoverState change.
HoverStatusChanged Se déclenche lorsque CurrentHoverStatus change.
InteractionStatusChanged Se déclenche lorsque CurrentInteractionStatus change.
LongPressCompleted Se déclenche à l’issue d’un mouvement d’appui long.
TouchGestureCompleted Se déclenche à l’issue d’un mouvement tactile.

Exemples

Vous trouverez un exemple de ce comportement en action dans l’Exemple d’application du kit de ressources de la communauté .NET MAUI.

API

Vous pouvez trouver le code source de TouchBehavior sur le référentiel du kit de ressources de la communauté .NET MAUI sur GitHub.

Migration à partir de Xamarin Community Toolkit

Dans le Xamarin Community Toolkit, il existait le TouchEffect si vous mettiez à niveau une application de Xamarin.Forms vers .NET MAUI. Il existe des changements cassants que vous devez savoir :

  1. Modifications du nom de l’API
  2. TouchBehavior est désormais implémenté en tant que PlatformBehavior

Modifications du nom de l’API

Nom dans Xamarin Community Toolkit Nom dans Kit d’outils de la communauté .NET MAUI
TouchEffect TouchBehavior
NormalBackgroundColor DefaultBackgroundColor
NormalScale DefaultScale
NormalOpacity DefaultOpacity
NormalTranslationX DefaultTranslationX
NormalTranslationY DefaultTranslationY
NormalRotation DefaultRotation
NormalRotationX DefaultRotationX
NormalRotationY DefaultRotationY
NormalAnimationDuration DefaultAnimationDuration
NormalAnimationEasing DefaultAnimationEasing
NormalBackgroundImageSource DefaultImageSource (déplacé vers ImageTouchBehavior)
NormalBackgroundImageAspect DefaultImageAspect (déplacé vers ImageTouchBehavior )

TouchBehavior est désormais implémenté en tant que PlatformBehavior

Dans Xamarin Community Toolkit, le TouchEffect a été implémenté en tant que AttachedEffect. Pour utiliser l’effet, utilisez les propriétés jointes et appliquez-les à n’importe quel VisualElement

Dans .NET MAUI, le TouchBehavior est implémenté sous forme de PlatformBehavior qui est désormais appliqué à la collection de comportements d’éléments, consultez Comportements de plateforme pour obtenir plus d’informations.

Remarque : par défaut dans .NET MAUI, les PlatformBehavior ne sont pas définis sur la propriété BindingContext. Cela est dû au fait que les comportements peuvent être partagés dans des styles. Le TouchBehavior définit la propriété BindingContext équivalente à VisualElement auquel elle est appliquée. Cela signifie que vous ne devez pas partager le TouchBehavior entre les éléments via des styles.

Voici un exemple de TouchEffect appliqué à une vue dans Xamarin.Forms :

<StackLayout Orientation="Horizontal"
            HorizontalOptions="CenterAndExpand"
            xct:TouchEffect.AnimationDuration="250"
            xct:TouchEffect.AnimationEasing="{x:Static Easing.CubicInOut}"
            xct:TouchEffect.PressedScale="0.8"
            xct:TouchEffect.PressedOpacity="0.6"
            xct:TouchEffect.Command="{Binding Command}">
    <BoxView Color="Gold" />
    <Label Text="The entire layout receives touches" />
    <BoxView Color="Gold"/>
</StackLayout>

L’équivalent TouchBehavior dans .NET MAUI ressemblera à ceci :

<HorizontalStackLayout 
    HorizontalOptions="Center" 
    VerticalOptions="Center"
    x:Name="TouchableHorizontalLayout">
    <HorizontalStackLayout.Behaviors>
        <toolkit:TouchBehavior
            DefaultAnimationDuration="250"
            DefaultAnimationEasing="{x:Static Easing.CubicInOut}"
            PressedOpacity="0.6"
            PressedScale="0.8"
            BindingContext="{Binding Path=BindingContext, Source={x:Reference TouchableHorizontalLayout}, x:DataType=HorizontalStackLayout}"
            Command="{Binding LayoutTappedCommand}" />
    </HorizontalStackLayout.Behaviors>

    <ContentView
        BackgroundColor="Gold"
        HeightRequest="100"
        WidthRequest="10" />
    <Label
        LineBreakMode="TailTruncation"
        Text="The entire layout receives touches"
        VerticalOptions="Center" />
    <ContentView
        BackgroundColor="Gold"
        HeightRequest="100"
        WidthRequest="10" />
</HorizontalStackLayout>