Estoy creando y la aplicación que necesita agregar y eliminar mucho UIElement
a un Canvas
. Básicamente un Canvas
contiene una colección de UIElement
y automáticamente lo actualiza/actualiza en la pantalla dependiendo de lo que contenga.
Para evitar tener toneladas de UIElements
quienes se superponen en la pantalla, prefiero agregarlos todos en una secundaria Canvas
Luego crea un Image
de eso (gracias a WritableBitmap
). Finalmente agrego esto Image
En mi actual Canvas
. Al permitir tener solo unas pocas imágenes en mi lienzo, espero tener un mejor rendimiento. Desafortunadamente parece que no puedo eliminar por completo el WritableBitmap
, incluso si lo configuro en null
.
El siguiente código lo ilustra:
//My constructor
public WP8Graphics()
{
//Here my collection DataBinded with the Canvas from the Mainpage
this.UIElements = new ObservableCollection<UIElement>();
//The secondary Canvas
GraphicCanvas = new Canvas();
GraphicCanvas.Height = MainPage.CurrentCanvasHeight;
GraphicCanvas.Width = MainPage.CurrentCanvasWidth;
}
///This method can be hit thousand times, it basically create a rectangle
public void fillRect(int x, int y, int width, int height)
{
// some code
// CREATE THE RECTANGLE rect
GraphicCanvas.Children.Add(rect); // My secondary Canvas
WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);
wb1.Invalidate();
WriteableBitmap wb2 = new WriteableBitmap((int)MainPage.CurrentCanvasWidth, (int)MainPage.CurrentCanvasHeight);
for (int i = 0; i < wb2.Pixels.Length; i++)
{
wb2.Pixels[i] = wb1.Pixels[i];
}
wb2.Invalidate();
wb1 = null;
Image thumbnail = new Image();
thumbnail.Height = MainPage.CurrentCanvasHeight;
thumbnail.Width = MainPage.CurrentCanvasWidth;
thumbnail.Source = wb2;
this.UIElements.Add(thumbnail);
}
Después de algo como 24 WriteableBitmap
creo un OutOfMemoryException aparece. Leí muchos artículos sobre este problema y en mi caso parece el WriteableBitmap
depende de mi Gráfico y permanece porque todavía tiene una referencia a ello. No puedo eliminar mi lienzo gráfico ni establecido Mi imagen Fuente de NULL.
Tengo 2 preguntas:
- ¿Hay otra forma de crear una imagen de lienzo o una colección de uielements?
- ¿Es posible eliminar la referencia que mantiene viva ese mapbitmap?
Espero ser lo suficientemente claro y fácil de leer.
Gracias por leer.
Editado con sugerencia de Atomaras, pero sigue siendo el mismo problema
WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);
Esta línea todavía arroja OffMemoryException.