commandmanager - command mvvm c#
ListView Memory Leak Windows Phone 8.1? (1)
Tengo un ListView vinculado a una ObservableCollection de objetos (que contiene URI de imagen). Cuando agrego más elementos al ListView, veo un pico masivo en la memoria. Creo que me he reducido a un problema con la imagenUri del UserModel. vea abajo.
public class UserModel : ObservableObject
{
...
private string _imageUri;
...
...
public string ImageUri
{
get
{
return _imageUri;
}
set
{
Set(() => ImageUri, ref _imageUri, value);
}
}
}
modelo de fotografia
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);
}
}
}
Xaml Enlace de ListView
<ListView
x:Name="MostPopularListView"
ItemsSource="{Binding PhotosCollection}"
ItemTemplate="{StaticResource MostPopularDataTemplate}"
Margin="0,0,0,0"
IsItemClickEnabled="True"/>
Plantilla 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>
...
Como puede ver, mi plantilla de datos ListView tiene dos imágenes, una para la foto real y otra para el usuario. Ambos se muestran correctamente, pero cuando continúo agregando más elementos a la lista, veo un pico masivo en la memoria.
Sin embargo, si no configuro UserModel.imageUri (UserModel.imageUri es null, entonces para todos los PhotoModels) no veo este pico en la memoria.
Ambos perfiles están llevando a cabo las mismas acciones cargando las mismas imágenes (total 15). La primera foto es con fotos del usuario y la segunda captura de pantalla está sin ella.
Creo que el problema tiene que ver con que PhotoModel tenga un UserModel y lo haga con Set (...). Como puede ver en las fotos a continuación, el controlador de eventos de cambio de propiedad tiene un recuento de 140.
La mayoría de estos son PhotoModels pero solo tengo 15 PhotoModels max en la Colección. Lo borro y vuelvo a agregar usando dos métodos de extensión (podría estar causándolo).
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);
}
}
Realmente agradecería algunos consejos sobre cómo manejar mejor el rendimiento y si esto es una pérdida de memoria.
El problema es cómo ImageBrush
decodifica la imagen más grande. Necesita configurar DecodePixelHeight
y DecodePixelWidth
de BitmapImage
Crédito: http://timheuer.com/blog/archive/2015/05/06/making-circular-images-in-xaml-easily.aspx