C# 需要填充下一页';通过执行上一页上的代码创建列表框

C# 需要填充下一页';通过执行上一页上的代码创建列表框,c#,windows-phone-8,windows-phone,windows-phone-8.1,C#,Windows Phone 8,Windows Phone,Windows Phone 8.1,我正在使用C#/XAML开发Windows Phone 8.1音乐播放器应用程序 当用户点击简介页面上的“下一步”按钮并转到第二页时,他将看到一个列表视图。此列表视图应包含手机上的所有歌曲。但这似乎至少需要3-5秒,用户最终不得不看一个空白的白色屏幕,直到所有歌曲都加载到列表中,然后列表被放入listview 我的方法是从第一个页面开始填充,所以当用户到达第二个页面时,要么listview已经填充完毕,要么几乎已经填充完毕 如果我在第一页停留3-5秒,然后转到下一页,我可以看到所有歌曲填充的li

我正在使用C#/XAML开发Windows Phone 8.1音乐播放器应用程序

当用户点击简介页面上的“下一步”按钮并转到第二页时,他将看到一个列表视图。此列表视图应包含手机上的所有歌曲。但这似乎至少需要3-5秒,用户最终不得不看一个空白的白色屏幕,直到所有歌曲都加载到列表中,然后列表被放入listview

我的方法是从第一个页面开始填充,所以当用户到达第二个页面时,要么listview已经填充完毕,要么几乎已经填充完毕

如果我在第一页停留3-5秒,然后转到下一页,我可以看到所有歌曲填充的listview。但是,如果应用程序一打开,我就立即按下按钮进入下一页,那么我只能看到列表视图填充了一半。虽然列表最终能够收集所有歌曲,但它只会将listview填充到读取所有歌曲时的位置

MainPage.xaml.cs(第一页):

使用系统;
使用System.Collections.Generic;
使用系统诊断;
使用System.IO;
使用System.Linq;
使用System.Runtime.InteropServices.WindowsRuntime;
使用System.Threading.Tasks;
使用Windows基金会;
使用Windows。
使用Windows.Storage;
使用Windows.Storage.FileProperties;
使用Windows.UI;
使用Windows.UI.ViewManagement;
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
使用Windows.UI.Xaml.Controls.Primitives;
使用Windows.UI.Xaml.Data;
使用Windows.UI.Xaml.Input;
使用Windows.UI.Xaml.Media;
使用Windows.UI.Xaml.Navigation;
名称空间测试版
{
公共密封部分类主页面:第页
{
列表源=新列表();
公共主页()
{
this.InitializeComponent();
this.setAllItems();
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
帧导航(类型(播放器));
}
专用异步任务getMusic(IStorageFolder文件夹)
{
var folders=await folder.GetFoldersAsync();
如果(文件夹!=null)
foreach(文件夹中的var fol)
等待音乐(fol);
var files=await folder.getfileasync();
foreach(文件中的var文件)
{
MusicProperties MusicProperties=await file.Properties.GetMusicProperties异步();
this.source.Add(新音乐(musicProperties.Artist,musicProperties.Title,musicProperties.Album));
Player.source=this.source;
}
}
私有异步void setAllItems()
{
等待此消息。获取音乐(Windows.Storage.KnownFolders.MusicLibrary);
}
}
}
Player.xaml.cs(第二页):

使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用System.Runtime.InteropServices.WindowsRuntime;
使用系统线程;
使用Windows基金会;
使用Windows。
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
使用Windows.UI.Xaml.Controls.Primitives;
使用Windows.UI.Xaml.Data;
使用Windows.UI.Xaml.Input;
使用Windows.UI.Xaml.Media;
使用Windows.UI.Xaml.Navigation;
使用Beta;
使用Windows.Storage;
使用System.Threading.Tasks;
使用Windows.Storage.Search;
使用Windows.Storage.FileProperties;
使用系统诊断;
名称空间测试版
{
公共密封部分类播放器:第页
{
公共静态列表源;
公共玩家()
{
this.InitializeComponent();
}
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
this.contentList.ItemsSource=source;
contentList.UpdateLayout();
}
}
}
当我到达播放器(第二个)页面时,我等待了一分钟,然后点击一个按钮(未显示),该按钮将使用
Debug.WriteLine()
打印列表的所有内容。它打印出了完整的清单

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

我有两个问题:

  • 如何让listview在列表获得更多项时自行填充更多项(可能是实时的,其中列表中的剩余项不断添加到listview,直到列表完成)

  • 有没有更快的方法来获取所有的音乐文件,这样我就不必依靠这些工作了


  • 对于第一个问题:使用可观察的集合:对于第二个问题,我们需要首先找到减速。递归调用的速度有多快?这是主减速吗?@ChubosaurusSoftware可能是。我还能怎么找到呢?你可以使用某种类型的探查器,但如果没有一个好的探查器,那么只需使用日期即可。Now()在事件发生之前和之后,然后考虑差异。如果遍历目录和文件是您看到如此巨大延迟的主要原因,那么我会在不同的线程上运行它。如果这样做,则必须调度Invoke以添加到ListView。
    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);
            }
        }
    }
    
    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();
            }
        }
    }