Come è possibile animare lo scorrimento di ListBox? So che posso usare scrollIntoView ma come posso animarlo? Voglio premere i tasti freccia per spostarmi da un oggetto ListBox a un altro.Animazione di scorrimento
risposta
Ecco un'implementazione approssimativa basata sullo stesso approccio come il seguente link
http://aniscrollviewer.codeplex.com/
La proprietà VerticalOffset
è in sola lettura così invece è possibile utilizzare una proprietà associata VerticalOffset
sul ScrollViewer
che a sua volta fa ScrollToVerticalOffset
. Questa proprietà associata può essere animata.
È inoltre possibile creare un metodo di estensione per ItemsControl
chiamato AnimateScrollIntoView
.
chiamare in questo modo
listBox.AnimateScrollIntoView(yourItem);
ScrollViewerBehavior
public class ScrollViewerBehavior
{
public static DependencyProperty VerticalOffsetProperty =
DependencyProperty.RegisterAttached("VerticalOffset",
typeof(double),
typeof(ScrollViewerBehavior),
new UIPropertyMetadata(0.0, OnVerticalOffsetChanged));
public static void SetVerticalOffset(FrameworkElement target, double value)
{
target.SetValue(VerticalOffsetProperty, value);
}
public static double GetVerticalOffset(FrameworkElement target)
{
return (double)target.GetValue(VerticalOffsetProperty);
}
private static void OnVerticalOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
ScrollViewer scrollViewer = target as ScrollViewer;
if (scrollViewer != null)
{
scrollViewer.ScrollToVerticalOffset((double)e.NewValue);
}
}
}
ItemsControlExtensions
public static class ItemsControlExtensions
{
public static void AnimateScrollIntoView(this ItemsControl itemsControl, object item)
{
ScrollViewer scrollViewer = VisualTreeHelpers.GetVisualChild<ScrollViewer>(itemsControl);
UIElement container = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as UIElement;
int index = itemsControl.ItemContainerGenerator.IndexFromContainer(container);
double toValue = scrollViewer.ScrollableHeight * ((double)index/itemsControl.Items.Count);
Point relativePoint = container.TranslatePoint(new Point(0.0, 0.0), Window.GetWindow(container));
DoubleAnimation verticalAnimation = new DoubleAnimation();
verticalAnimation.From = scrollViewer.VerticalOffset;
verticalAnimation.To = toValue;
verticalAnimation.DecelerationRatio = .2;
verticalAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(1000));
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(verticalAnimation);
Storyboard.SetTarget(verticalAnimation, scrollViewer);
Storyboard.SetTargetProperty(verticalAnimation, new PropertyPath(ScrollViewerBehavior.VerticalOffsetProperty));
storyboard.Begin();
}
}
e dal momento che è anche necessario per ottenere una sospensione del ScrollViewer
avrete bisogno di questo
public static class VisualTreeHelpers
{
public static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
}
Dai un'occhiata a questo article, spiega come lo scorrimento è animato e aggiungi gesti tattili. Scarica la fonte nella parte inferiore della pagina e guarda la soluzione WpfScrollContent. Estenderei il ListBox WPF e aggiungerò l'animazione a scorrimento in questo modo per riutilizzare il controllo.
link interrotto .... – patrickbadley
pubblicato oltre 2 anni fa ... – evanb
@evanb che è esattamente il motivo per le risposte che contengono nulla, ma i collegamenti sono scoraggiati. –
- 1. morbida animazione di scorrimento NSScrollView scrollToPoint:
- 2. Animazione di jquery/Javascript Opacity con scorrimento
- 3. Serrature Scorrimento/Scrollbar Dopo scrollTop Animazione
- 4. Animazione file di registro di scorrimento (tail -f) utilizzando javascript
- 5. AFNetworking - Animazione dissolvenza sull'immagine durante lo scorrimento di UITableView
- 6. come scorrere la vista di scorrimento orizzontale senza animazione
- 7. Animazione con scorrimento personalizzato (Tilt, Mazzo di carte, 3D, ecc.)
- 8. Animazione animazione a livello di scorrevole android
- 9. Apertura di una tenda: animazione con animazione core
- 10. Listener di animazione per animazione personalizzata
- 11. ViewPager a scorrimento programmatico
- 12. animazione immagine vista scala animazione
- 13. UINavigationController - bug animazione pop
- 14. Animazione del pulsante di azione mobile Android
- 15. Animazione rotazione Android con ScrollView
- 16. Animazione di un MKOverlayView
- 17. Animazione di Flipboard
- 18. Animazione di dissolvenza UITableViewCell
- 19. CSS3 Posizione di animazione
- 20. animazione css3 su: hover; forzare intera animazione
- 21. iOS: springWithDamping come animazione per animazione KeyFrame
- 22. Animazione di più oggetti contemporaneamente in AngularJS produce animazione choppy
- 23. Animazione di animazione e compressione Angular-ui-bootstrap non funzionante
- 24. Animazione delle funzionalità in OpenLayers3
- 25. Funzione di scorrimento automatico per UILabel
- 26. Scorrimento orizzontale nelle pagine di scorrimento orizzontale
- 27. UITableView Barra di scorrimento personalizzata
- 28. Cover di libro di flip di animazione iOS e facilità
- 29. Modello di architettura di animazione
- 30. Animazione UIView basata su velocità UIPanGestureRecognizer
Quale sarebbe il valore di animazione.to se voglio scorrere orizzontalmente? – Cobold
Potrebbe esserci un errore nel codice: 'scrollViewer.ScrollableHeight * ((double) index/itemsControl.Items.Count); ' deve essere ' scrollViewer.ScrollableHeight * ((double) index/(itemsControl.Items.Count -1)); ' per esempio, se l'elenco contiene 12 elementi e voglio scorrere fino all'ultimo (indice 11), il risultato è di diventare ' scrollViewer.ScrollableHeight * 1' anche, attenzione divisione per zero:) – sim1
@ sim1: Non ho guardato a questo per molto tempo quindi sono sicuro che hai ragione. Grazie per l'aggiornamento :) –