Les animations d’insertion d’éléments de ListView dans WinRT

Récemment, j’ai commencé à créer ma propre grosse application Windows 8 Store. Travaillant sur l’interface utilisateur, j’ai commencé à reproduire de bonnes interfaces utilisateur.

J’ai rencontré une animation très intéressante d’insertion de nouveaux éléments dans la vue liste de l’application Mail standard. Lorsque vous cliquez sur la chaîne, il se développe et affiche tous les messages en chaîne.

Voici la vidéo capturée.

Je n’ai aucune idée de la technique qu’ils ont utilisée pour réaliser cette animation et ce comportement.

Quelqu’un peut-il m’aider, expliquer ou donner un exemple, comment puis-je obtenir un tel comportement? Merci.

L’application de messagerie est écrite en JavaScript. Par conséquent, cela ne vous aidera pas beaucoup à savoir comment cela s’est fait, car cette stack d’interface utilisateur est assez différente de celle de XAML. Cependant, le fait est que les contrôles de liste sont probablement animés de la même manière, il vous suffit donc d’append / supprimer certains éléments de la liste pour obtenir l’effet de développement / réduction.

J’ai joué avec pendant un moment et c’est ce que j’ai proposé qui utilise la propriété ItemTemplateSelector de ListView pour définir quelques modèles d’élément différents.

entrez la description de l'image ici

                                       

Code derrière:

 using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using App82.Common; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace App82 { public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); var items = new ObservableCollection(); var item1 = new BasicItem { Title = "Item 1", Gist = "This item has some content that is not fully shown..." }; var item2 = new ExpandedItem { Title = "Item 2", Gist = "This item has some content that is not fully shown..." }; var item3 = new ExpandedItem { Title = "Item 3", Gist = "This item has some content that is not fully shown..." }; var item4 = new ExpandedItem { Title = "Item 4", Gist = "This item has some content that is not fully shown..." }; var item5 = new BasicItem { Title = "Item 5", Gist = "This item has some content that is not fully shown..." }; var itemGroup1 = new CollapsibleItem(items, new[] { item2, item3, item4 }); items.Add(item1); items.Add(itemGroup1); items.Add(item5); this.ListView.ItemsSource = items; } private void OnItemClick(object sender, ItemClickEventArgs e) { var collapsibleItem = e.ClickedItem as CollapsibleItem; if (collapsibleItem != null) collapsibleItem.ToggleCollapse(); } } public class CollapsibleListItemTemplateSelector : DataTemplateSelector { public DataTemplate BasicItemTemplate { get; set; } public DataTemplate CollapsibleItemTemplate { get; set; } public DataTemplate ExpandedItemTemplate { get; set; } protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container) { if (item is ExpandedItem) return ExpandedItemTemplate; if (item is BasicItem) return BasicItemTemplate; //if (item is CollapsibleItem) return CollapsibleItemTemplate; } } public class BasicItem : BindableBase { #region Title private ssortingng _title; public ssortingng Title { get { return _title; } set { this.SetProperty(ref _title, value); } } #endregion #region Gist private ssortingng _gist; public ssortingng Gist { get { return _gist; } set { this.SetProperty(ref _gist, value); } } #endregion } public class ExpandedItem : BasicItem { } public class CollapsibleItem : BindableBase { private readonly IList _hostCollection; #region IsExpanded private bool _isExpanded; public bool IsExpanded { get { return _isExpanded; } set { if (this.SetProperty(ref _isExpanded, value)) { if (_isExpanded) Expand(); else Collapse(); } } } #endregion #region ChildItems private ObservableCollection _childItems; public ObservableCollection ChildItems { get { return _childItems; } set { this.SetProperty(ref _childItems, value); } } #endregion public CollapsibleItem( IList hostCollection, IEnumerable childItems) { _hostCollection = hostCollection; _childItems = new ObservableCollection(childItems); } public void ToggleCollapse() { IsExpanded = !IsExpanded; } private void Expand() { int i = _hostCollection.IndexOf(this) + 1; foreach (var childItem in ChildItems) { _hostCollection.Insert(i++, childItem); } } private void Collapse() { int i = _hostCollection.IndexOf(this) + 1; for (int index = 0; index < ChildItems.Count; index++) { _hostCollection.RemoveAt(i); } } } }