Работя върху приложение за 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 въпроса:
Как да накарам изгледа на списък да се самопопълва с повече записи, когато списъкът получава повече елементи (може би в реално време, където останалите елементи от списъка непрекъснато се добавят към изгледа на списък, докато списъкът не бъде завършен?
Има ли по-бърз начин да получа всички музикални файлове, така че да не се налага да разчитам на това решение?