我正在使用C#/ XAML中的Windows Phone 8.1音乐播放器应用程序。
当用户点击"下一个"在介绍页面上按钮并转到第二页,他将看到一个列表视图。这个列表视图应该填充手机上的所有歌曲。但这似乎需要至少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()
打印出列表中的所有内容。它打印出完整的清单。
因此异步任务正在完成其工作并完成列表,但它无法正确完成列表视图。
我有两个问题:
如何使列表视图自我填充更多条目,因为列表会获得更多项目(可能是实时的,列表中的其余项目会持续添加到列表视图中,直到列表完成?< / p>
有没有更快的方法来获取所有音乐文件,所以我不必依赖这种解决方法?