需要通过执行上一页的代码来填充下一页的列表框

时间:2014-08-23 06:10:18

标签: c# windows-phone-8 windows-phone windows-phone-8.1

我正在使用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()打印出列表中的所有内容。它打印出完整的清单。

因此异步任务正在完成其工作并完成列表,但它无法正确完成列表视图。

我有两个问题:

  1. 如何使列表视图自我填充更多条目,因为列表会获得更多项目(可能是实时的,列表中的其余项目会持续添加到列表视图中,直到列表完成?< / p>

  2. 有没有更快的方法来获取所有音乐文件,所以我不必依赖这种解决方法?

0 个答案:

没有答案