崩溃发生在此页面中。
虽然没有给我一个例外,但我相信应该是Setup
函数导致了崩溃。
当参数songs
有大约300个项目时,它工作得很好(我还没有测试最大值(。
然而,当有800个或更多的项目时(我也还没有测试最小值(,它会崩溃,这将使我有很多AlbumView
,其构造函数在这里定义。
在其构造函数中,它异步地查找和设置Cover
(来自StorageItemThumbnail
(。我相信找到缩略图是一项IO操作。可能是频繁的IO操作导致了崩溃。但我不确定。
有人能给我一些关于如何修理车祸的建议吗?
songs
的数据源来自我电脑文件夹中的音乐文件。我已经将它们分组到子文件夹中,我的应用程序适用于各个子文件夹。当我使用我所有音乐文件的根文件夹时,它会崩溃,该文件夹大约有2800个文件。
---更新---
我只是通过注释函数FindThumbnail
来确认崩溃是由频繁的IO引起的。
所以我尝试通过使用惰性加载策略来修复它。我首先给AlbumView.Cover
一个默认值。然后在我的GridViewItem
的Loaded
事件中,我调用FindThumbnail()
。
private void DropShadowControl_Loaded(object sender, RoutedEventArgs e)
{
((sender as FrameworkElement).DataContext as AlbumView)?.FindThumbnail();
}
更多源代码在这里。
我现在不再崩溃了,但这似乎有问题。每一个DropShadowControl
都应该有一个相应的AlbumView
,但我有时会得到null
。我认为这可能是我的另一个问题的原因,即我的大多数DropShadowControl
在加载后仍然显示默认图像。但是,在我重定向回AlbumsPage
之后,这些缩略图会正确显示。
我已经将Cover
的绑定设置为OneWay
,您可以从这里看到。
我有什么问题?
经过一些尝试,我发现我最初的问题是由于频繁的IO操作。
所以为了避免这种情况,我需要进行懒惰加载。
在更新的问题中提到的我以前的加载策略(将东西放入Loaded
事件(的问题并不好,因为如果我的DropShadowControl
不可见,即使它已加载,它也会有一个null DataContext
。我靠这个找到缩略图。
因此,我需要一个当我的控件可见且数据上下文可用时的事件,即DataContextChanged
。
通过将代码放在该函数/事件中而不是Loaded
中,我的问题得到了完美的解决。