下面有一行代码调用SearchAlbums(text)
。通过删除此行,我不再得到StackOverflowException
,因此我相信这是给我带来麻烦的行。
public ObservableCollection<AlbumView> Albums = new ObservableCollection<AlbumView>();
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.Parameter is string text)
{
// User Search
MainPage.Instance.SetHeaderText(GetSearchHeader(text, MainPage.Instance.IsMinimal));
History.Push(text);
SearchArtists(text);
SearchAlbums(text);
SearchSongs(text);
SearchPlaylists(text);
}
else
{
// Back to Search Page
MainPage.Instance.SetHeaderText(GetSearchHeader(History.Pop(), MainPage.Instance.IsMinimal));
}
}
public void SearchAlbums(string text)
{
Albums.Clear();
foreach (var group in MusicLibraryPage.AllSongs.Where((m) => IsTargetAlbum(m, text)).GroupBy((m) => m.Album))
{
Music music = group.ElementAt(0);
Albums.Add(new AlbumView(music.Album, music.Artist, group.OrderBy((m) => m.Name).ThenBy((m) => m.Artist)));
}
}
因此,我在此函数中设置了一个断点,实际上我能够毫无例外地运行此函数。 StackOverflowException
在执行OnNavigatedTo
之后发生。
我认为AlbumView
的构造函数可能与它有关:
public AlbumView(string name, string artist, IEnumerable<Music> songs)
{
Name = name;
Artist = artist;
Songs = new ObservableCollection<Music>(songs);
FindThumbnail();
}
public async void FindThumbnail()
{
foreach (var music in Songs)
if ((Cover = await Helper.GetThumbnailAsync(music, false)) != null)
break;
if (Cover == null) Cover = Helper.DefaultAlbumCover;
}
但是我还在另一个page的其他地方也使用了此构造函数,并且page完美显示了。
上面发布的第一段代码在此page中。当有匹配的相册时,会发生例外。
我不知道如何解决。我只能猜测这可能是异步操作的问题。预先感谢!
我测试了您的代码。您的问题不在于代码隐藏,而在于控件。
对于具有异步的实例,请使用Binding
而不是x:Bind
来绑定实例。因为Binding
是运行时绑定,而x:Bind
是编译时绑定。
将您的代码更改为此:
SearchPage.xaml
...
<controls:Carousel.ItemTemplate>
<DataTemplate x:DataType="data:AlbumView">
<local:GridAlbumControl DataContext="{Binding}" />
</DataTemplate>
</controls:Carousel.ItemTemplate>
...
最诚挚的问候。