TouchBehavior

Das TouchBehavior ist ein Behavior, das die Interaktion mit jedem VisualElement über Touch-, Mausklick- und Hover-Ereignisse ermöglicht. Die TouchBehavior-Implementierung ermöglicht es, viele verschiedene visuelle Eigenschaften des VisualElement, an das sie angefügt ist, anzupassen, z. B. die BackgroundColor, Opacity, Rotation und Scale sowie viele andere Eigenschaften.

Hinweis

Das Toolkit bietet auch die ImageTouchBehavior-Implementierung, die diese TouchBehavior erweitert, indem es auch die Möglichkeit bietet, die Source eines Image-Elements anzupassen.

Wichtig

.NET MAUI Community Toolkit Behaviors legt den BindingContext eines Verhaltens nicht fest, da Verhalten über Stile freigegeben und auf mehrere Steuerelemente angewendet werden können. Weitere Informationen finden Sie unter .NET MAUI Behaviors.

Syntax

Die folgenden Beispiele zeigen, wie Sie das TouchBehavior einem übergeordneten HorizontalStackLayout hinzufügen und die folgenden Animationen ausführen, wenn ein Benutzer das HorizontalStackLayout oder eines seiner untergeordneten Elemente berührt oder darauf klickt:

  • animiert über einen Zeitraum von 250 Millisekunden
  • wendet CubicInOutEasing an
  • ändert die Opacity auf 0,6
  • ändert Scale in 0,8

XAML

Einbinden des XAML-Namespace

Um das Toolkit in XAML verwenden zu können, muss der folgende xmlns-Abschnitt zu Ihrer Seite oder Ansicht hinzugefügt werden:

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

Daher Folgendes:

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

Würde geändert werden, um xmlns wie folgt einzufügen:

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

Verwenden von 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#

TouchBehavior kann wie folgt in C# verwendet werden:

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

C#-Markup

Das Paket CommunityToolkit.Maui.Markup bietet eine viel präzisere Möglichkeit, dieses Behavior in C# zu verwenden.

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
            });
    }
}

Weitere Beispiele

Umgang mit Mouseover-Interaktionen

Die TouchBehavior bietet die Möglichkeit, die Eigenschaften der angefügten VisualElement anzupassen, je nachdem, ob der Mauszeiger über dem Element bewegt wird.

Das folgende Beispiel zeigt, wie Sie die TouchBehavior an eine HorizontalStackLayout anhängen und die BackgroundColor und Scale der HorizontalStackLayout ändern, wenn ein Benutzer den Mauszeiger über das Layout und beliebige untergeordnete Elemente bewegt.

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

Umgang mit der Interaktion durch langes Drücken

Die TouchBehavior bietet die Möglichkeit, das Szenario zu behandeln, wenn ein Benutzer über einen längeren Zeitraum drückt. Dieser Zeitraum kann durch LongPressDuration definiert werden, das in Millisekunden angegeben wird.

Das folgende Beispiel zeigt, wie Sie die TouchBehavior einem HorizontalStackLayouthinzufügen, die LongPressCommand an die im Sicherungsansichtsmodell definierten IncreaseLongPressCountCommand binden und die LongPressDuration auf 750 Millisekunden festlegen.

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

Eigenschaften

Eigenschaft Typ Beschreibung
Get-Help ICommand Ruft die ICommand ab, die aufgerufen werden soll, wenn der Benutzer eine Touchgeste abgeschlossen hat, oder legt diese fest.
CommandParameter object Dient zum Abrufen oder Festlegen des Parameters, der an die Command-Eigenschaft übergeben werden soll.
CurrentHoverState HoverState Dient zum Abrufen oder Festlegen des aktuellen HoverState-Verhaltens.
CurrentHoverStatus HoverStatus Dient zum Abrufen oder Festlegen des aktuellen HoverStatus-Verhaltens.
Aktueller Interaktionsstatus TouchInteractionStatus Dient zum Abrufen oder Festlegen des aktuellen TouchInteractionStatus-Verhaltens.
AktuellerBerührungsstatus TouchState Dient zum Abrufen oder Festlegen des aktuellen TouchState-Verhaltens.
Aktueller Touch-Status TouchStatus Dient zum Abrufen oder Festlegen des aktuellen TouchStatus-Verhaltens.
DefaultAnimationDuration int Ruft die Dauer der Animation ab, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist, oder legt sie fest.
DefaultAnimationEasing Easing Ruft das Easing der Animation ab oder legt es fest, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist.
Standardhintergrundfarbe Color Dient zum Abrufen oder Festlegen der Hintergrundfarbe des Elements, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist.
Standarddeckkraft double Ruft die Deckkraft des Elements ab oder legt sie fest, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist.
DefaultRotation double Ruft die Drehung um die X- und Y-Achsen des Elements ab oder legt sie fest, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist.
DefaultRotationX double Ruft die Drehung des Elements um die X-Achse ab oder legt sie fest, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist.
DefaultRotationY double Ruft die Drehung des Elements um die Y-Achse ab oder legt sie fest, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist.
DefaultScale double Ruft die Skalierung des Elements ab, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist, oder legt diese fest.
DefaultTranslationX double Ruft die X-Übersetzung des Elements ab, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist, oder legt diese fest.
DefaultTranslationY double Dient zum Abrufen oder Festlegen der Y-Übersetzung des Elements, wenn die CurrentTouchState-Eigenschaft TouchState.Default ist.
DisallowTouchThreshold int Ruft den Schwellenwert ab, ab dem Touch-Eingaben nicht mehr zugelassen werden, oder legt ihn fest.
HoveredAnimationDuration int Ruft die Dauer der Animation ab, wenn die CurrentHoverState-Eigenschaft HoverState.Hovered ist, oder legt sie fest.
HoveredAnimationEasing Easing Ruft das Easing der Animation ab oder legt es fest, wenn die Eigenschaft CurrentHoverState auf HoverState.Hovered festgelegt ist.
Hintergrundfarbe beim Darüberfahren mit der Maus Color Dient zum Abrufen oder Festlegen der Hintergrundfarbe des Elements, wenn die CurrentHoverState-Eigenschaft HoverState.Hovered ist.
Deckkraft beim Darüberfahren double Dient zum Abrufen oder Festlegen der Deckkraft des Elements, wenn die CurrentHoverState Eigenschaft HoverState.Hovered ist.
HoveredRotation double Ruft die Drehung des Elements um die X- und Y-Achse ab oder legt sie fest, wenn die CurrentHoverState-Eigenschaft HoverState.Hovered ist.
HoveredRotationX double Ruft die Rotation des Elements um die X-Achse ab oder legt sie fest, wenn die Eigenschaft CurrentHoverState den Wert HoverState.Hovered hat.
HoveredRotationY double Ruft die Drehung des Elements um die Y-Achse ab oder legt sie fest, wenn die CurrentHoverState-Eigenschaft HoverState.Hovered ist.
HoveredScale double Ruft die Skalierung des Elements ab, wenn die CurrentHoverState-Eigenschaft HoverState.Hovered ist, oder legt diese fest.
HoveredTranslationX double Ruft die X-Übersetzung des Elements ab, wenn die CurrentHoverState-Eigenschaft HoverState.Hovered ist, oder legt diese fest.
HoveredTranslationY double Dient zum Abrufen oder Festlegen der Y-Übersetzung des Elements, wenn die CurrentHoverState-Eigenschaft HoverState.Hovered ist.
IsEnabled bool Ruft einen Wert ab, der angibt, ob das Verhalten aktiviert ist, oder legt diesen fest.
LongPressCommand ICommand Ruft den ICommand ab, der aufgerufen werden soll, wenn der Benutzer ein langes Drücken abgeschlossen hat, oder legt diesen fest.
LongPressCommandParameter object Dient zum Abrufen oder Festlegen des Parameters, der an die LongPressCommand-Eigenschaft übergeben werden soll.
LongPressDuration int Ruft die Dauer in Millisekunden ab, die zum Auslösen der langen Druckgeste erforderlich ist, oder legt sie fest.
PressedAnimationDuration int Ruft die Dauer der Animation ab, wenn die CurrentTouchState-Eigenschaft TouchState.Pressed ist, oder legt sie fest.
Animations-Beschleunigungskurve beim Drücken Easing Ruft das Easing der Animation ab oder legt es fest, wenn die Eigenschaft CurrentTouchState auf TouchState.Pressed festgelegt ist.
PressedBackgroundColor Color Dient zum Abrufen oder Festlegen der Hintergrundfarbe des Elements, wenn die CurrentTouchState-Eigenschaft TouchState.Pressed ist.
PressedOpacity double Dient zum Abrufen oder Festlegen der Deckkraft des Elements, wenn die CurrentTouchState Eigenschaft TouchState.Pressed ist.
Gedrückte Drehung double Ruft die Drehung des Elements um die X- und Y-Achse ab oder legt sie fest, wenn die CurrentTouchState-Eigenschaft TouchState.Pressed ist.
PressedRotationX double Ruft die Rotation des Elements um die X-Achse ab oder legt sie fest, wenn die Eigenschaft CurrentTouchState den Wert TouchState.Pressed hat.
PressedRotationY double Ruft die Drehung des Elements um die Y-Achse ab oder legt sie fest, wenn die CurrentTouchState-Eigenschaft TouchState.Pressed ist.
PressedScale double Ruft die Skalierung des Elements ab, wenn die CurrentTouchState-Eigenschaft TouchState.Pressed ist, oder legt diese fest.
PressedTranslationX double Ruft die X-Übersetzung des Elements ab, wenn die CurrentTouchState-Eigenschaft TouchState.Pressed ist, oder legt diese fest.
PressedTranslationY double Dient zum Abrufen oder Festlegen der Y-Übersetzung des Elements, wenn die CurrentTouchState-Eigenschaft TouchState.Pressed ist.
Soll die Eingabe der untergeordneten Elemente transparent machen bool Dient zum Abrufen oder Festlegen eines Werts, der angibt, ob die untergeordneten Elemente des Elements eingabetransparent gemacht werden sollen.

Ereignisse

Ereignis Beschreibung
CurrentTouchStateChanged Wird ausgelöst, wenn sich CurrentTouchState ändert.
CurrentTouchStatusChanged Wird ausgelöst, wenn sich CurrentTouchStatus ändert.
HoverStateChanged Wird ausgelöst, wenn sich CurrentHoverState ändert.
HoverStatusChanged Wird ausgelöst, wenn sich CurrentHoverStatus ändert.
InteractionStatusChanged Wird ausgelöst, wenn sich CurrentInteractionStatus ändert.
LongPressCompleted Wird ausgelöst, wenn eine lange Drückgeste abgeschlossen ist.
TouchGestureCompleted Wird ausgelöst, wenn eine Touchgeste abgeschlossen wurde.

Beispiele

Sie finden ein Beispiel für dieses Verhalten in Aktion in der Beispielanwendung für das .NET MAUI Community Toolkit.

API

Sie finden den Quellcode für TouchBehavior über das GitHub-Repository für das .NET MAUI Community Toolkit.

Migrieren von Xamarin Community Toolkit

Im Xamarin Community Toolkit gab es TouchEffect, wenn Sie ein Upgrade für eine App von Xamarin.Forms auf .NET MAUI durchführen, gibt es einige Breaking Changes, die Sie beachten sollten:

  1. API-Namensänderungen
  2. TouchBehavior ist jetzt implementiert als PlatformBehavior

API-Namensänderungen

Name im Xamarin Community Toolkit Name im MAUI Community Toolkit
TouchEffect TouchBehavior
Normale Hintergrundfarbe Standardhintergrundfarbe
NormalScale DefaultScale
Normale Deckkraft Standarddeckkraft
NormalTranslationX DefaultTranslationX
NormalTranslationY DefaultTranslationY
NormalRotation DefaultRotation
NormalRotationX DefaultRotationX
NormalRotationY DefaultRotationY
NormalAnimationDuration DefaultAnimationDuration
NormalAnimationEasing DefaultAnimationEasing
NormalBackgroundImageSource DefaultImageSource (in ImageTouchBehavior verschoben)
NormalBackgroundImageAspect DefaultImageAspect (In ImageTouchBehavior verschoben)

TouchBehavior ist jetzt als PlatformBehavior implementiert.

Im Xamarin Community Toolkit wurde TouchEffect als AttachedEffect implementiert. Um den Effekt zu verwenden, verwenden Sie die angefügten Eigenschaften und wenden sie auf jedes VisualElement an

Weitere Informationen zur Implementierung von TouchBehavior in .NET MAUI als PlatformBehavior, was jetzt auf die Elementverhaltenssammlung angewendet wird, finden Sie unter Platform Behaviors.

Hinweis: Standardmäßig legen PlatformBehaviors in .NET MAUI die Eigenschaft BindingContext nicht fest, da Behaviors in Formatvorlagen gemeinsam verwendet werden können. TouchBehavior legt die Eigenschaft BindingContext gleich VisualElement fest, auf das sie angewendet wird. Dies bedeutet, dass Sie das TouchBehavior zwischen Elementen über Formatvorlagen nicht teilen sollten.

Nachfolgend finden Sie ein Beispiel für einen TouchEffect, der auf eine Ansicht in Xamarin.Forms angewendet wird:

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

Das Äquivalent TouchBehavior in .NET MAUI würde wie folgt aussehen:

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