Трябва да попълните списъка на следващата страница, като изпълните кода на предишната страница

Работя върху приложение за Windows Phone 8.1 Music Player в C#/XAML.

Когато потребителят натисне бутона "Напред" на въвеждащата страница и отиде на втората страница, той ще види списък. Този изглед на списък трябва да бъде попълнен с всички песни на телефона. Но това изглежда отнема поне 3-5 секунди и в крайна сметка потребителят трябва да гледа празен бял екран, докато всички песни не бъдат заредени в списък и след това списъкът се поставя в списъка.

Моят подход беше вместо това да започна популацията на първата страница, така че докато потребителите идват на втората страница, или изгледът на списък вече е попълнен, или почти е приключил с попълването.

Ако остана на първата страница за 3-5 секунди и след това отида на следващата страница, мога да видя списъка, попълнен с всички песни добре. Но вместо това, ако веднага щом приложението се отвори, веднага натисна бутона и отида на следващата страница, тогава виждам изгледа на списъка попълнен само наполовина. Въпреки че в крайна сметка списъкът може да събере всички песни, той попълва списъка само до точката, в която е бил, когато е прочел всички песни.

MainPage.xaml.cs (Първа страница):

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Storage;
using Windows.Storage.FileProperties;
using Windows.UI;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace Beta
{
    public sealed partial class MainPage : Page
    {
        List<Music> source = new List<Music>();
        public MainPage()
        {
            this.InitializeComponent();
            this.setAllItems();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Frame.Navigate(typeof(Player));
        }

        private async Task getMusic(IStorageFolder folder)
        {
            var folders = await folder.GetFoldersAsync();
            if (folders != null)
                foreach (var fol in folders)
                    await getMusic(fol);

            var files = await folder.GetFilesAsync();
            foreach (var file in files)
            {
                MusicProperties musicProperties = await file.Properties.GetMusicPropertiesAsync();
                this.source.Add(new Music(musicProperties.Artist, musicProperties.Title, musicProperties.Album));
                Player.source = this.source;
            }
        }
        private async void setAllItems()
        {
            await this.getMusic(Windows.Storage.KnownFolders.MusicLibrary);
        }
    }
}

Player.xaml.cs (втора страница):

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Beta;
using Windows.Storage;
using System.Threading.Tasks;
using Windows.Storage.Search;
using Windows.Storage.FileProperties;
using System.Diagnostics;

namespace Beta
{
    public sealed partial class Player : Page
    {
        public static List<Music> source;
        public Player()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this.contentList.ItemsSource = source;
            contentList.UpdateLayout();
        }
    }
}

Когато пристигнах на страницата на плейъра (втората), изчаках една минута и след това натиснах бутон (не е показан), който използва Debug.WriteLine() за отпечатване на цялото съдържание на списъка. Отпечата пълния списък.

Така че асинхронната задача върши работата си и попълва списъка, но не е в състояние да завърши изгледа на списъка правилно.

Имам 2 въпроса:

  1. Как да накарам изгледа на списък да се самопопълва с повече записи, когато списъкът получава повече елементи (може би в реално време, където останалите елементи от списъка непрекъснато се добавят към изгледа на списък, докато списъкът не бъде завършен?

  2. Има ли по-бърз начин да получа всички музикални файлове, така че да не се налага да разчитам на това решение?


person DemCodeLines    schedule 23.08.2014    source източник
comment
За първия ви въпрос: Използвайте вместо това колекция, която може да се наблюдава: stackoverflow.com/questions/25397664/   -  person Chubosaurus Software    schedule 23.08.2014
comment
За втория ви въпрос, първо трябва да намерим забавянето. Колко бързо е това рекурсивно повикване? Това ли е основното забавяне?   -  person Chubosaurus Software    schedule 23.08.2014
comment
@ChubosaurusSoftware Възможно е. Как иначе бих могъл да разбера?   -  person DemCodeLines    schedule 23.08.2014
comment
Можете да използвате някакъв тип профайлър, но ако нямате добър, просто измерете времето с помощта на Date.Now() преди и след събитието, след което вземете разликата.   -  person Chubosaurus Software    schedule 24.08.2014
comment
Ако преминаването през директориите и файловете е основната причина, поради която виждате това огромно забавяне, тогава бих го пуснал в друга нишка. Ако го направите по този начин, тогава трябва да изпратите Invoke, за да добавите към вашия ListView.   -  person Chubosaurus Software    schedule 24.08.2014