关于c#:足够调用Children.Clear在WPF画布上删除旧控件然后再添加新控件?

Enough to call Children.Clear on a WPF canvas to get rid of old controls before adding new ones?

我正在试验wpf并重新实现我的旧迷宫屏幕保护程序。

我的代码基本上在画布上添加了一组图像,构建了一个网格,64x64像素的图像并排覆盖整个画布。然后我在迷宫中"动画化"移动,这应该是滚动迷宫,通过调整翻译转换,并交换出图像。

不过,我好像有点泄密。每当我调整窗口的大小时,我都希望重新构建图像组件,以便用更多或更少的图像再次覆盖表单。

如果我将窗体的左下角沿紧密的圆圈拖动,则重建部分将变得越来越慢。

要删除旧控件,我只需执行以下操作:

1
_Canvas.Children.Clear();

够了吗?由于经济放缓,我想不是。

然而,由于迷宫目前不是"阿凡达"所"发现",所以迷宫图像是以25%的不透明度绘制的,我假设如果我不能移除它们,我会得到很多图像,但看起来也不是这样。

我正在缓存图像源,图像组件的创建方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
_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;
    }
}

之后,他们被分配图像如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}

我还应该寻找什么?是否需要以任何方式处理图像组件?


调用_Canvas.Children.Clear();将从可视树中删除对图像的所有引用,因此没有泄漏。您可能需要检查在_Images中保存的旧图像引用,或者您可能维护的其他一些集合。例如,您说您正在缓存图像源——这样做效率很低,或者维护一个不断增长的陈旧图像列表肯定会影响您的系统。