Migliorare le esperienze ScrollViewer esistenti

Questo articolo illustra come usare un controllo ScrollViewer e ExpressionAnimation XAML per creare esperienze di movimento basate su input dinamico.

Prerequisiti

In questo caso si presuppone che si abbia familiarità con i concetti illustrati in questi articoli:

Perché eseguire la compilazione su ScrollViewer?

In genere, si usa il controllo ScrollViewer XAML esistente per creare una superficie scorrevole e zoomabile per il contenuto dell'app. Con l'introduzione del linguaggio Fluent Design, è diventato necessario concentrarsi anche su come usare l'azione di scorrimento o zoom di una superficie per guidare altre esperienze di movimento. Ad esempio, usando lo scorrimento per guidare un'animazione sfocatura di uno sfondo o guidare la posizione di una "intestazione fissa".

In questi scenari, si sfrutta il comportamento o le esperienze di manipolazione, ad esempio lo scorrimento e lo zoom per rendere altre parti dell'app più dinamiche. Questo a sua volta consente all'app di apparire più coesa e rende le esperienze più memorabili agli occhi degli utenti finali. Rendendo più memorabile l'interfaccia utente, gli utenti finali possono interagire con l'app più frequentemente e più a lungo.

Cosa è possibile creare sopra ScrollViewer?

È possibile sfruttare la posizione di ScrollViewer per creare una serie di esperienze dinamiche:

  • Parallasse: usare la posizione di ScrollViewer per spostare lo sfondo o il contenuto in primo piano a una velocità relativa alla posizione di scorrimento.
  • StickyHeaders: usare la posizione di ScrollViewer per animare e "rendere fissa" un'intestazione in una posizione
  • Effetti basati su input: usare la posizione di un controllo Scrollviewer per animare un effetto di composizione, ad esempio una sfocatura.

In generale, facendo riferimento alla posizione di ScrollViewer con ExpressionAnimation, è possibile creare un'animazione che cambia dinamicamente rispetto alla quantità di scorrimento.

Visualizzazione elenco con parallasse

Intestazione timida

Uso di ScrollViewerManipulationPropertySet

Per creare queste esperienze dinamiche usando un controllo ScrollViewer XAML, bisogna fare riferimento alla posizione di scorrimento in un'animazione. A tale scopo, accedere a CompositionPropertySet off di ScrollViewer XAML denominato ScrollViewerManipulationPropertySet. ScrollViewerManipulationPropertySet contiene una singola proprietà Vector3 denominata Translation che consente di accedere alla posizione di scorrimento di ScrollViewer. È quindi possibile fare riferimento a questo come a qualsiasi altro CompositionPropertySet in ExpressionAnimation.

Passaggi generali per iniziare:

  1. Accedere a ScrollViewerManipulationPropertySet tramite ElementCompositionPreview.
    • ElementCompositionPreview.GetScrollViewerManipulationPropertySet(ScrollViewer scroller)
  2. Creare un oggetto ExpressionAnimation che fa riferimento alla proprietà Translation da PropertySet.
    • Non dimenticare di impostare il parametro di riferimento.
  3. Impostare come destinazione la proprietà di compositionObject con ExpressionAnimation.

Nota

È consigliabile assegnare propertySet restituito dal metodo GetScrollViewerManipulationPropertySet a una variabile di classe. In questo modo si garantisce che il set di proprietà non venga pulito da Garbage Collection e pertanto non abbia alcun effetto sulla ExpressionAnimation in cui viene fatto riferimento. Le ExpressionAnimation non mantengono un riferimento sicuro a nessuno degli oggetti utilizzati nell'equazione.

Esempio

Si esaminerà ora il modo in cui viene messo insieme l'esempio di parallasse illustrato in precedenza. Per riferimento, tutto il codice sorgente per l'app è disponibile nel repository Windows UI Dev Labs su GitHub.

Per prima cosa è necessario ottenere un riferimento a ScrollViewerManipulationPropertySet.

_scrollProperties =
    ElementCompositionPreview.GetScrollViewerManipulationPropertySet(myScrollViewer);

Il passaggio successivo consiste nel creare ExpressionAnimation che definisce un'equazione che utilizza la posizione di scorrimento di ScrollViewer.

_parallaxExpression = compositor.CreateExpressionAnimation();
_parallaxExpression.SetScalarParameter("StartOffset", 0.0f);
_parallaxExpression.SetScalarParameter("ParallaxValue", 0.5f);
_parallaxExpression.SetScalarParameter("ItemHeight", 0.0f);
_parallaxExpression.SetReferenceParameter("ScrollManipulation", _scrollProperties);
_parallaxExpression.Expression = "(ScrollManipulation.Translation.Y + StartOffset - (0.5 * ItemHeight)) * ParallaxValue - (ScrollManipulation.Translation.Y + StartOffset - (0.5 * ItemHeight))";

Nota

È anche possibile usare le classi helper ExpressionBuilder per costruire questa stessa Expression senza la necessità di stringhe:

var scrollPropSet = _scrollProperties.GetSpecializedReference<ManipulationPropertySetReferenceNode>();
var parallaxValue = 0.5f;
var parallax = (scrollPropSet.Translation.Y + startOffset);
_parallaxExpression = parallax * parallaxValue - parallax;

Infine, si prende questa ExpressionAnimation e si fa riferimento all'oggetto visivo che si desidera sottoporre a parallasse. In questo caso, l'immagine per ogni elemento nell'elenco.

Visual visual = ElementCompositionPreview.GetElementVisual(image);
visual.StartAnimation("Offset.Y", _parallaxExpression);