Достаточно ли вызвать Children.Clear на холсте WPF, чтобы избавиться от старых элементов управления, прежде чем добавлять новые? - PullRequest
5 голосов
/ 18 февраля 2010

Я экспериментирую с 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 Ответ

6 голосов
/ 18 февраля 2010

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

...