TouchBehavior

TouchBehavior è un Behavior che consente di interagire con qualsiasi VisualElement basato su eventi di tocco, clic del mouse e passaggio del mouse. L'implementazione TouchBehavior consente di personalizzare molte proprietà visive diverse dell'oggetto VisualElement a cui è associato, ad esempio BackgroundColor, OpacityRotatione Scale, nonché molte altre proprietà.

Nota

Il toolkit fornisce anche l'implementazione ImageTouchBehavior, che estende questo TouchBehavior consentendo anche di personalizzare il Source di un elemento Image.

Importante

I comportamenti di .NET MAUI Community Toolkit non impostano la proprietà BindingContext di un comportamento, perché i comportamenti possono essere condivisi e applicati a più controlli mediante gli stili. Per altre informazioni, vedere Comportamenti MAUI di .NET

Sintassi

Gli esempi seguenti illustrano come aggiungere l'oggetto TouchBehavior a un elemento padre HorizontalStackLayout ed eseguire le animazioni seguenti quando un utente tocca o fa clic su HorizontalStackLayout o su uno dei relativi elementi figlio:

  • si anima nell’arco di 250 millisecondi
  • applica il CubicInOutEasing
  • modifica Opacity in 0.6
  • modifica Scale in 0.8

XAML

Inclusione dello spazio dei nomi XAML

Per usare il toolkit in XAML, è necessario aggiungere le informazioni seguenti xmlns nella pagina o nella visualizzazione:

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

Di conseguenza:

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

Verrà modificato in modo da includere l'oggetto xmlns come indicato di seguito:

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

Utilizzo di 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#

Può TouchBehavior essere usato come indicato di seguito in 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;
    }
}

Linguaggio di markup C#

Il nostro CommunityToolkit.Maui.Markup pacchetto fornisce un modo molto più conciso per usare questo Behavior in 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
            });
    }
}

Esempi aggiuntivi

Gestione dell'interazione al passaggio del mouse

TouchBehavior consente di personalizzare le proprietà dell'elemento associato VisualElement a seconda che il puntatore del mouse passi sopra l'elemento.

L'esempio seguente mostra come associare TouchBehavior a un HorizontalStackLayout e modificare BackgroundColor e Scale del HorizontalStackLayout quando un utente sposta il puntatore del mouse sul layout e su uno qualsiasi degli elementi figlio.

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

Gestione dell'interazione con pressione prolungata

TouchBehavior offre la possibilità di gestire lo scenario quando un utente preme per un lungo periodo di tempo. Questo periodo di tempo può essere definito da , LongPressDuration espresso in unità di millisecondi.

L'esempio seguente mostra come aggiungere il TouchBehavior a un HorizontalStackLayout, associare il LongPressCommand al IncreaseLongPressCountCommand definito nel view model sottostante e impostare il LongPressDuration su 750 millisecondi.

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

Proprietà

Proprietà Tipo Descrizione
Comando ICommand Ottiene o imposta il ICommand da invocare quando l'utente ha completato un gesto di tocco.
CommandParameter object Ottiene o imposta il parametro da passare alla Command proprietà .
CurrentHoverState HoverState Ottiene o imposta il HoverState corrente del comportamento.
CurrentHoverStatus HoverStatus Ottiene o imposta l'elemento corrente HoverStatus del comportamento.
CurrentInteractionStatus TouchInteractionStatus Ottiene o imposta il corrente TouchInteractionStatus del comportamento.
CurrentTouchState TouchState Restituisce o imposta il TouchState corrente del comportamento.
CurrentTouchStatus TouchStatus Recupera o imposta il TouchStatus corrente del comportamento.
Durata predefinita dell'animazione int Ottiene o imposta la durata dell'animazione quando la CurrentTouchState proprietà è TouchState.Default.
DefaultAnimationEasing Easing Ottiene o definisce la funzione di easing dell'animazione quando la proprietà CurrentTouchState è TouchState.Default.
Colore di sfondo predefinito Color Ottiene o imposta il colore di sfondo dell'elemento quando la CurrentTouchState proprietà è TouchState.Default.
Opacità predefinita double Ottiene o imposta l'opacità dell'elemento quando la CurrentTouchState proprietà è TouchState.Default.
Rotazione predefinita double Ottiene o imposta la rotazione intorno agli assi X e Y dell'elemento quando la CurrentTouchState proprietà è TouchState.Default.
DefaultRotationX double Ottiene o imposta la rotazione attorno all'asse X dell'elemento quando la CurrentTouchState proprietà è TouchState.Default.
DefaultRotationY double Ottiene o imposta la rotazione attorno all'asse Y dell'elemento quando la CurrentTouchState proprietà è TouchState.Default.
Scala predefinita double Ottiene o imposta la scala dell'elemento quando la CurrentTouchState proprietà è TouchState.Default.
DefaultTranslationX double Ottiene o imposta la conversione X dell'elemento quando la CurrentTouchState proprietà è TouchState.Default.
DefaultTranslationY double Ottiene o imposta la conversione Y dell'elemento quando la CurrentTouchState proprietà è TouchState.Default.
DisattivaSogliaTocco int Ottiene o imposta il valore di soglia per la disabilitazione del tocco.
DurataAnimazioneAlPassaggioDelMouse int Ottiene o imposta la durata dell'animazione quando la CurrentHoverState proprietà è HoverState.Hovered.
Smorzamento dell'animazione al passaggio del mouse Easing Ottiene o imposta l'interpolazione dell'animazione quando la proprietà CurrentHoverState è HoverState.Hovered.
Colore di sfondo al passaggio del mouse Color Ottiene o imposta il colore di sfondo dell'elemento quando la CurrentHoverState proprietà è HoverState.Hovered.
Opacità al passaggio del mouse double Ottiene o imposta l'opacità dell'elemento quando la CurrentHoverState proprietà è HoverState.Hovered.
HoveredRotation double Ottiene o imposta la rotazione intorno agli assi X e Y dell'elemento quando la CurrentHoverState proprietà è HoverState.Hovered.
HoveredRotationX double Ottiene o imposta la rotazione attorno all'asse X dell'elemento quando la CurrentHoverState proprietà è HoverState.Hovered.
HoveredRotationY double Ottiene o imposta la rotazione attorno all'asse Y dell'elemento quando la CurrentHoverState proprietà è HoverState.Hovered.
HoveredScale double Ottiene o imposta la scala dell'elemento quando la CurrentHoverState proprietà è HoverState.Hovered.
HoveredTranslationX double Ottiene o imposta la conversione X dell'elemento quando la CurrentHoverState proprietà è HoverState.Hovered.
HoveredTranslationY double Ottiene o imposta la conversione Y dell'elemento quando la CurrentHoverState proprietà è HoverState.Hovered.
IsEnabled bool Ottiene o imposta un valore che indica se il comportamento è abilitato.
LongPressCommand ICommand Ottiene o imposta il ICommand da invocare quando l'utente ha completato una pressione prolungata.
LongPressCommandParameter object Ottiene o imposta il parametro da passare alla LongPressCommand proprietà .
LongPressDuration int Ottiene o imposta la durata in millisecondi necessaria per attivare il movimento di pressione prolungata.
Durata animazione pressione int Ottiene o imposta la durata dell'animazione quando la CurrentTouchState proprietà è TouchState.Pressed.
PressedAnimationEasing Easing Ottiene o definisce l'interpolazione dell'animazione quando la proprietà CurrentTouchState è TouchState.Pressed.
ColoreSfondoPremuto Color Ottiene o imposta il colore di sfondo dell'elemento quando la CurrentTouchState proprietà è TouchState.Pressed.
Opacità alla pressione double Ottiene o imposta l'opacità dell'elemento quando la CurrentTouchState proprietà è TouchState.Pressed.
PressedRotation double Ottiene o imposta la rotazione intorno agli assi X e Y dell'elemento quando la CurrentTouchState proprietà è TouchState.Pressed.
PressedRotationX double Ottiene o imposta la rotazione attorno all'asse X dell'elemento quando la CurrentTouchState proprietà è TouchState.Pressed.
PressedRotationY double Ottiene o imposta la rotazione attorno all'asse Y dell'elemento quando la CurrentTouchState proprietà è TouchState.Pressed.
PressedScale double Ottiene o imposta la scala dell'elemento quando la CurrentTouchState proprietà è TouchState.Pressed.
PressedTranslationX double Ottiene o imposta la conversione X dell'elemento quando la CurrentTouchState proprietà è TouchState.Pressed.
PressedTranslationY double Ottiene o imposta la conversione Y dell'elemento quando la CurrentTouchState proprietà è TouchState.Pressed.
DovrebbeRendereTrasparenteLInputDeiFigli bool Ottiene o imposta un valore che indica se gli elementi figlio dell'elemento devono essere resi trasparenti all'input.

Eventi

Evento Descrizione
CurrentTouchStateChanged Viene generato quando CurrentTouchState cambia.
CurrentTouchStatusChanged Viene generato quando CurrentTouchStatus cambia.
HoverStateChanged Si attiva quando CurrentHoverState cambia.
HoverStatusChanged Si attiva quando CurrentHoverStatus cambia.
InteractionStatusChanged Si attiva quando CurrentInteractionStatus cambia.
LongPressCompleted Si attiva quando un gesto di pressione prolungata è stato completato.
TouchGestureCompleted Si attiva quando un gesto di tocco è stato completato.

Esempi

È possibile trovare un esempio di questo comportamento in azione nell'applicazione di esempio .NET MAUI Community Toolkit.

API

Puoi trovare il codice sorgente di TouchBehavior nel repository GitHub di .NET MAUI Community Toolkit.

Migrazione da Xamarin Community Toolkit

In Xamarin Community Toolkit è presente TouchEffect se si esegue l'aggiornamento di un'app da Xamarin.Forms a .NET MAUI sono state apportate alcune modifiche di rilievo che è necessario tenere presente:

  1. Modifiche al nome dell'API
  2. TouchBehavior è ora implementato come PlatformBehavior

Modifiche al nome dell'API

Nome in Xamarin Community Toolkit Nome in MAUI Community Toolkit
TouchEffect TouchBehavior
Colore di sfondo normale Colore di sfondo predefinito
NormalScale Scala predefinita
Opacità normale Opacità predefinita
NormalTranslationX DefaultTranslationX
NormalTranslationY DefaultTranslationY
Rotazione normale Rotazione predefinita
NormalRotationX DefaultRotationX
NormalRotationY DefaultRotationY
Durata normale dell'animazione Durata predefinita dell'animazione
NormalAnimationEasing DefaultAnimationEasing
NormalBackgroundImageSource DefaultImageSource (spostato in ImageTouchBehavior)
Proporzioni immagine di sfondo normale DefaultImageAspect (spostato in ImageTouchBehavior )

TouchBehavior è ora implementato come PlatformBehavior

Nel Xamarin Community Toolkit, TouchEffect è stato implementato come AttachedEffect. Per usare l'effetto, si utilizzano le proprietà allegate e le si applica a qualsiasi VisualElement

In .NET MAUI, TouchBehavior viene implementato come PlatformBehavior, che ora viene applicato alla raccolta dei comportamenti degli elementi; per ulteriori informazioni, vedere Platform Behaviors.

Nota: per impostazione predefinita, in .NET MAUI gli elementi PlatformBehavior non impostano la proprietà BindingContext, perché i comportamenti possono essere condivisi negli stili. L'oggetto TouchBehavior imposta la BindingContext proprietà uguale all'oggetto VisualElement a cui viene applicato. Ciò significa che non dovresti condividere il TouchBehavior tra gli elementi tramite gli stili.

Di seguito è riportato un esempio di applicazione TouchEffect a una vista in 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'equivalente TouchBehavior in .NET MAUI sarà simile al seguente:

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