Достаточно ли вызвать Children.Clear на холсте WPF, чтобы избавиться от старых элементов управления, прежде чем добавлять новые?

Я экспериментирую с WPF и заново внедряю свой старый скринсейвер.

Мой код в основном добавляет кучу изображений на холст, создавая сетку, 64x64 пикселей изображения рядом, чтобы покрыть весь холст. Затем я "оживляю" движение в лабиринте, который должен прокручивать лабиринт, настраивая преобразование перевода и меняя изображения.

Однако, похоже, у меня какая-то утечка. Всякий раз, когда я изменяю размер окна, я хочу перестроить компоненты изображения, чтобы снова покрыть форму, с большим или меньшим количеством изображений.

Если я перетаскиваю нижний левый угол формы узкими кругами, восстановленная часть становится все медленнее и медленнее.

Чтобы удалить старые элементы управления, я просто сделал это:

_Canvas.Children.Clear();

этого достаточно? Из-за замедления я предполагаю, что это не так.

Однако, поскольку лабиринт в настоящее время не "обнаружен" "аватаром", изображения лабиринта нарисованы с непрозрачностью 25%, и я предположил бы, что, если мне не удастся удалить их, я получу много изображений поверх друг друга, но, похоже, это тоже не так.

Я кеширую источники изображений, компоненты изображений создаются так:

_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;
    }
}

После этого им присваивают изображения, которые будут отображаться так:

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;
}

Что еще я должен искать? Есть ли необходимость утилизировать компоненты изображения каким-либо образом?

1 ответ

Решение

Призвание _Canvas.Children.Clear(); удалит все ссылки на изображения из визуального дерева, поэтому там нет утечек. Вы можете проверить наличие старых ссылок на изображения в _Imagesили какую-то другую коллекцию, которую вы можете хранить. Например, вы сказали, что кэшируете источники изображений - делая это неэффективно или поддерживая постоянно растущий список устаревших изображений, определенно повлияет на вашу систему.

Другие вопросы по тегам