Je crée et l'application qui doit ajouter et supprimer beaucoup de UIElement
à un Canvas
. Fondamentalement un Canvas
contient une collection de UIElement
et le rende automatiquement / met à jour à l'écran en fonction de ce qu'il contient.
Afin d'éviter d'avoir un tonne UIElements
qui se chevauchent sur l'écran, je préfère les ajouter tous sur un secondaire Canvas
Créez ensuite un Image
De là (merci à WritableBitmap
). Enfin j'ajoute ceci Image
sur mon actuel Canvas
. En permettant d'avoir seulement quelques images sur ma toile, je m'attends à avoir de meilleures performances. Malheureusement il semble que je ne peux pas supprimer complètement le WritableBitmap
, même si je le définis sur null
.
Le code suivant l'illustre:
//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);
}
Après quelque chose comme 24 WriteableBitmap
A créé un OutofMemoryException apparaît. J'ai lu de nombreux articles sur ce problème et dans mon cas, il semble que le WriteableBitmap
dépend de mon Graphiccanvas et reste parce qu'il y a encore une référence. Je ne peux pas supprimer ma toile graphique ni défini mon image source à null.
J'ai 2 questions:
- Existe-t-il une autre façon de créer une image à partir de toile ou une collection d'uiements?
- Est-il possible de supprimer la référence qui maintient ce bitbitmap Writeableable en vie?
J'espère être assez clair et facile à lire.
Merci pour la lecture.
Édité avec la suggestion d'Atomaras, mais toujours le même problème
WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);
Cette ligne lance toujours OutOfMemoryException.