Question

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.

Était-ce utile?

La solution

Vous devez copier les pixels de l'original WritableBitmap (qui conservera les GraphicsCanvas) dans un nouveau Writable Bitmap.

Jetez un œil à ce super post http://www.wintellect.com/blogs/jprosise/silverlight-sbig-image-problem-and-what-you-can-odo-about-it

Aussi pourquoi gardez-vous tous les bitbitmaps Writeable dans la collection Uiements? Le dernier ne suffirait-il pas? Vous ne pouvez pas effacer la collection Uiements juste avant d'ajouter le dernier / nouveau bitmap?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top