我有一个 ListView 绑定(bind)到对象的 ObservableCollection(包含图像 URI),当我向 ListView 添加更多项目时,我看到内存中出现大量峰值。我想我已经将其缩小为 UserModel 的 imageUri 的问题。见下文。
public class UserModel : ObservableObject
{
...
private string _imageUri;
...
...
public string ImageUri
{
get
{
return _imageUri;
}
set
{
Set(() => ImageUri, ref _imageUri, value);
}
}
}
照片模型
public class PhotoModel : ObservableObject
{
...
private UserModel _user;
private string _imageUri;
...
...
public UserModel User
{
get
{
return _user;
}
set
{
Set(() => User, ref _user, value);
}
}
public string ImageUri
{
get
{
return _imageUri;
}
set
{
Set(() => ImageUri, ref _imageUri, value);
}
}
}
ListView的Xaml绑定(bind)
<ListView
x:Name="MostPopularListView"
ItemsSource="{Binding PhotosCollection}"
ItemTemplate="{StaticResource MostPopularDataTemplate}"
Margin="0,0,0,0"
IsItemClickEnabled="True"/>
ListView 模板
...
<Image
Source="{Binding ImageUri}"
Stretch="Fill"
Height="300" />
...
<Ellipse
Width="40"
Height="40"
Margin="10,0,0,10">
<Ellipse.Fill>
<ImageBrush>
<ImageBrush.ImageSource>
<BitmapImage UriSource="{Binding User.ImageUri}" />
</ImageBrush.ImageSource>
</ImageBrush>
</Ellipse.Fill>
</Ellipse>
...
如您所见,我的 ListView 数据模板有两张图片,一张用于实际照片,一张用于用户。两者都正确显示,但是当我继续向列表中添加更多项目时,我发现内存出现了巨大的峰值。
但是,如果我不设置 UserModel.imageUri(对于所有 PhotoModel,UserModel.imageUri 为 null)我不会在内存中看到这个峰值。
两个配置文件都执行相同的操作加载相同的图像(总共 15 个)。第一张照片带有用户照片,第二张截图没有。
我认为问题与具有 UserModel 并执行 Set(...) 的 PhotoModel 有关。从下面的照片中可以看出,属性更改事件处理程序的计数为 140。
其中大部分是 PhotoModels,但我的收藏中最多只有 15 个 PhotoModels。我使用两种扩展方法清除并重新添加(可能是你造成的)。
public static void Repopulate<T>(this ICollection<T> collection, IEnumerable<T> items)
{
collection.Clear();
foreach (var item in items)
{
collection.Add(item);
}
}
public static void AddObjects<T>(this ICollection<T> collection, IEnumerable<T> items)
{
foreach (var item in items)
{
collection.Add(item);
}
}
我非常感谢有关如何更好地处理性能以及这是否是内存泄漏的建议。
最佳答案
问题在于 ImageBrush
如何解码较大的图像。您需要设置 BitmapImage
DecodePixelHeight
和 DecodePixelWidth
来源:http://timheuer.com/blog/archive/2015/05/06/making-circular-images-in-xaml-easily.aspx
关于c# - ListView 内存泄漏 Windows Phone 8.1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29590570/