2010-02-18 4 views
5

Ich experimentiere mit WPF und implementiere meinen alten Labyrinth-Bildschirmschoner.Genug, um Children.Clear auf einem WPF-Canvas aufzurufen, um alte Steuerelemente loszuwerden, bevor neue hinzugefügt werden?

Mein Code fügt der Leinwand im Grunde eine Reihe von Bildern hinzu und erstellt ein Raster, 64 x 64 Pixel nebeneinander, um die gesamte Leinwand abzudecken. Dann "animiere" ich die Bewegung im Irrgarten, der das Labyrinth durchrollen soll, indem ich eine Übersetzungstransformation anpasse und die Bilder austausche.

Allerdings scheint es, dass ich ein Leck habe. Immer wenn ich die Größe des Fensters ändere, möchte ich die Bildkomponenten neu aufbauen, um das Formular entweder mit mehr oder weniger Bildern wieder abzudecken.

Wenn ich die untere linke Ecke des Formulars in enge Kreise ziehe, wird der rebuild-Teil immer langsamer.

Um die alten Kontrollen entferne ich dies einfach tat:

_Canvas.Children.Clear(); 

ist das genug? Aufgrund der Verlangsamung gehe ich davon aus, dass dies nicht der Fall ist.

Da das Labyrinth jedoch derzeit nicht vom "Avatar" "entdeckt" wird, werden die Labyrinthbilder mit 25% Deckkraft gezeichnet, und ich würde annehmen, dass wenn ich sie nicht entfernen würde, ich viele Bilder oben bekommen würde von einander, aber das scheint auch nicht zu sein.

ich die Bildquellen am Cachen werden die Bildkomponenten wie folgt erstellt:

_Images = new Image[(int)width, (int)height]; 
for (int x = -1; x < width - 1; x++) 
{ 
    for (int y = -1; y < height - 1; y++) 
    { 
     Image i = new Image(); 
     i.Width = 64; 
     i.Height = 64; 
     i.Source = _Outside; 
     Canvas.SetLeft(i, x * 64); 
     Canvas.SetTop(i, y * 64); 
     _Canvas.Children.Add(i); 
     _Images[x + 1, y + 1] = i; 
    } 
} 

Danach sind sie zugeordnet Bilder wie diese zeigen:

Maze.Square sq = _Maze[_TopLeftMazeX + x, _TopLeftMazeY + y]; 
Image img = _Images[x + 1, y + 1]; 

if (sq.Seen) 
    img.Opacity = 1.0; 
else 
    img.Opacity = 0.25; 
switch (sq.Type) 
{ 
    case Maze.SquareType.Hallway: 
     img.Source = _Hallway; 
     break; 

    case Maze.SquareType.Wall: 
     img.Source = _Wall; 
     break; 

    case Maze.SquareType.Outside: 
     img.Source = _Outside; 
     break; 
} 

Was sonst sollte ich suchen ? Müssen die Bildkomponenten in irgendeiner Weise entsorgt werden?

Antwort

6

Durch den Aufruf _Canvas.Children.Clear(); werden alle Verweise auf die Bilder aus dem visuellen Baum entfernt, sodass keine Lecks vorhanden sind. Sie können nach alten Bildreferenzen suchen, die unter _Images oder einer anderen Sammlung, die Sie möglicherweise pflegen, gespeichert werden. Zum Beispiel sagten Sie, dass Sie die Bildquellen zwischenspeichern - dies ineffizient zu tun, oder eine ständig wachsende Liste von veralteten Bildern zu behalten, wird sich definitiv auf Ihr System auswirken.

+0

Das _Images-Feld ist nur ein Array, jedes Mal neu erstellt, wenn ich die Steuerelemente neu erstellt, und die Quellen werden nicht neu geladen, nachdem das Programm sie einmal geladen hat, so scheint es keiner von denen zu sein könnte der Schuldige sein. Aber danke, dass du das klargemacht hast. Klar genug, um die alten Kontrollen loszuwerden. Es ist zumindest nicht dieser Teil. –

Verwandte Themen