Frage

Ich erstelle und Anwendung, die viel hinzufügen und entfernen müssen UIElement zu einem Canvas. Grundsätzlich a Canvas enthält eine Sammlung von UIElement und rendern/aktualisiert es automatisch auf dem Bildschirm, je nachdem, was es enthält.

Um zu vermeiden, eine Tonnen von UIElements Wer überlappt sich gegenseitig auf dem Bildschirm? Ich ziehe es vor, alle auf einem Sekundarstufe hinzuzufügen Canvas Dann erstellen Sie a Image von ihm (danke an WritableBitmap). Endlich füge ich das hinzu Image auf meinem Strom Canvas. Indem ich nur wenige Bild auf meiner Leinwand haben kann, erwarte ich eine bessere Leistung. Leider scheint es, dass ich die nicht vollständig löschen kann WritableBitmap, auch wenn ich es aufstelle null.

Der folgende Code zeigt es:

//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);

}

Nach ungefähr 24 WriteableBitmap erschuf ein OutofMemoryException erscheint. Ich habe viele Artikel über dieses Problem gelesen und in meinem Fall scheint es das zu sein WriteableBitmap hängt von meinem ab GraphicCanvas und bleibt, weil es immer noch einen Hinweis darauf hat. Ich kann meine grafische Leinwand nicht löschen oder nicht gesetzt mein Bild Quelle zu null.

Ich habe 2 Frage:

  • Gibt es eine andere Möglichkeit, ein Bild aus Leinwand oder eine Sammlung von Uielements zu erstellen?
  • Ist es möglich, die Referenz zu entfernen, die diese Schreibensbitmap am Leben hält?

Ich hoffe, genug klar und leicht zu lesen.

Danke fürs Lesen.

Bearbeitet mit Atomaras Vorschlag, aber immer noch das gleiche Problem

WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);Diese Zeile wirft immer noch die MemoryException aus.

War es hilfreich?

Lösung

Sie müssen die Pixel der ursprünglichen Schreibableerbitmap (die an den GraphicsCanvas festhalten) in eine neue Schreibensabteilung kopieren.

Schauen Sie sich diesen tollen Beitrag an http://www.wintellect.com/blogs/jprosise/silverlight-big-image-problem-and-what-you-can-do-about-it

Auch warum behalten Sie alle Schreiben in der Uielements -Sammlung? Würde das Neueste nicht ausreichen? Kannst du die Uielements -Sammlung nicht gerade löschen, bevor du die neueste/neue Bitmap hinzufügt?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top