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.