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?
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. –