C# 需要填充下一页';通过执行上一页上的代码创建列表框
我正在使用C#/XAML开发Windows Phone 8.1音乐播放器应用程序 当用户点击简介页面上的“下一步”按钮并转到第二页时,他将看到一个列表视图。此列表视图应包含手机上的所有歌曲。但这似乎至少需要3-5秒,用户最终不得不看一个空白的白色屏幕,直到所有歌曲都加载到列表中,然后列表被放入listview 我的方法是从第一个页面开始填充,所以当用户到达第二个页面时,要么listview已经填充完毕,要么几乎已经填充完毕 如果我在第一页停留3-5秒,然后转到下一页,我可以看到所有歌曲填充的listview。但是,如果应用程序一打开,我就立即按下按钮进入下一页,那么我只能看到列表视图填充了一半。虽然列表最终能够收集所有歌曲,但它只会将listview填充到读取所有歌曲时的位置 MainPage.xaml.cs(第一页):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
使用系统;
使用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
我有两个问题:
对于第一个问题:使用可观察的集合:对于第二个问题,我们需要首先找到减速。递归调用的速度有多快?这是主减速吗?@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();
}
}
}