Estoy experimentando con WPF y volviendo a implementar mi viejo protector de pantalla de laberinto.Suficiente para llamar a Children.Clear en un lienzo de WPF para deshacerse de los controles anteriores antes de agregar otros nuevos.
Mi código básicamente agrega un montón de imágenes al lienzo, construyendo una cuadrícula, imágenes de 64x64 píxeles una al lado de la otra, para cubrir todo el lienzo. Luego, "animaré" el movimiento en el laberinto, que se supone recorrerá el laberinto, ajustando una transformación de traducción e intercambiando las imágenes.
Sin embargo, parece que tengo una fuga de algún tipo. Cada vez que cambio el tamaño de la ventana, quiero volver a crear los componentes de la imagen para volver a cubrir el formulario, ya sea con más o menos imágenes.
Si arrastro la esquina inferior izquierda del formulario en círculos cerrados, la parte de reconstrucción se vuelve lenta y lenta.
Para eliminar los viejos controles simplemente me hizo esto:
_Canvas.Children.Clear();
es esto suficiente? Debido a la desaceleración, supongo que no es así.
Sin embargo, dado que el laberinto actualmente no es "descubierto" por el "avatar", las imágenes del laberinto se dibujan con un 25% de opacidad, y supongo que si no las eliminase, obtendría muchas imágenes en la parte superior el uno del otro, pero tampoco parece ser eso.
estoy almacenamiento en caché de las fuentes de imagen, los componentes de la imagen se crean de esta manera:
_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;
}
}
imágenes Después que están asignados a mostrar como esto:
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;
}
¿Qué más debo buscar ? ¿Existe la necesidad de deshacerse de los componentes de la imagen de alguna manera?
El campo _Images es solo una matriz, se vuelve a crear cada vez que reconstruyo los controles, y las fuentes no se vuelven a cargar después de que el programa las cargó una vez, por lo que para mí no parece ser ninguna de las que podría ser el culpable Pero gracias por aclarar eso. Clear es suficiente para deshacerse de los viejos controles. No es esa parte al menos. –