足够调用Children.Clear在WPF画布上删除旧控件之前添加新控件?

ang*_*son 5 c# wpf children canvas slowdown

我正在尝试使用WPF并重新实现我的旧迷宫屏幕保护程序.

我的代码基本上将一堆图像添加到画布,并排构建一个网格,64x64像素图像,以覆盖整个画布.然后我通过调整平移变换并交换图像,在迷宫中"动画"运动,该运动应该围绕迷宫滚动.

但是,我似乎有某种泄漏.每当我调整窗口大小时,我都想重新构建图像组件,以便再次覆盖表单,或者使用更多或更少的图像.

如果我将形式的左下角拖动到紧密的圆圈中,则重建部分会变得越来越慢.

要删除旧控件我只是这样做:

_Canvas.Children.Clear();
Run Code Online (Sandbox Code Playgroud)

这够了吗?由于减速,我认为不是.

然而,由于迷宫目前没有被"头像""发现",迷宫图像以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;
    }
}
Run Code Online (Sandbox Code Playgroud)

之后他们会分配图像来显示如下:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*ake 6

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