WPF Canvas将无法在循环中正确绘制

时间:2014-07-16 14:50:03

标签: c# wpf wpf-controls

我目前正在使用WPF使用画布绘制平铺地图编辑器,但出于某种原因,它不能使用循环。

我已经生成了一个基于16x16图块的160px160p地图。 当我尝试在循环中添加它们时,它不会添加它们。

    public void DrawFullMap()
    {
        for (int i = 0; i < cMap.mapFile.lMap.Count; i++ )
        {
            MapPoint mp = cMap.mapFile.lMap[i];
            pWindow.DrawOnCanvas(mp.x, mp.y, tileWidth, tileHeight, mp.iTileID);
        }
    }

        private void DrawOnCanvas(int x, int y, int tileWidth, int tileHeight, int index)
        {
            if (editor != null)
            {
                Image imgAdd = new Image();
                imgAdd.Source = editor.Tileset[index];
                imgAdd.Width = tileWidth;
                imgAdd.Height = tileHeight;
                imgAdd.Margin = new Thickness(x * tileWidth, y * tileHeight, 0, 0);
                cvMap.Children.Add(imgAdd);
                // Textbox for debug
                tbdbg.Text += "X: " + x + " Y:" + y + " Tile:" + index + "\n";
            }
       }

在使用时,我创建的文本框应该包含我要添加的所有图块,但它确实存在,但由于某种原因,画布保持为空(或者只添加1-4个图块,取决于画布大小)。 click for example

当尝试手动添加它们(MouseEvent)时,它工作正常,只有循环导致问题。 为什么呢?

修改 将保证金更改为SetTop&amp; SetLeft,添加生成地图的功能

        private void DrawOnCanvas(int x, int y, int tileWidth, int tileHeight, int index)
        {
            if (editor != null)
            {
                Image imgAdd = new Image()
                {
                    Width = tileWidth,
                    Height = tileHeight,
                    Source = editor.Tileset[index],
                };
                Canvas.SetTop(imgAdd, y * tileHeight);
                Canvas.SetLeft(imgAdd, x * tileWidth);
                cvMap.Children.Add(imgAdd);
                // Textbox for debug
                tbdbg.Text += "X: " + x + " Y:" + y + " Tile:" + index + "\n";
            }
       }

    public void CreateMapfile(int width, int height)
    {
        mapFile = new Map();
        mapFile.iWidth = width;
        mapFile.iHeight = height;
        mapFile.lMap = new List<MapPoint>();
        for(int i = 0; i < height; i+=16)
        {
            for(int j = 0; j < width; j+=16)
            {
                MapPoint mp = new MapPoint();
                mp.x = i;
                mp.y = j;
                mp.eType = TileType.Normal;
                mp.iLayer = 0;
                mp.iTileID = 0;
                this.mapFile.lMap.Add(mp);
            }
        }
    }

发现问题

好吧,这是我身上的一个问题。 因为我用过

Canvas.SetTop(imgAdd, y * tileHeight);

我忘记了之前使用的值是平铺位置,而不是宽度。 当手动设置瓷砖时,它显示例如X:1 Y:2,而循环显示X:16 Y:32。看起来我今天错过了我的咖啡,哈哈。

1 个答案:

答案 0 :(得分:1)

你不应该使用保证金在Canvas上放置物品。您必须使用Canvas.SetTop和Canvas.SetLeft设置图像的位置。我猜你所有的图像都被添加到画布但是在同一个位置,所以你只能在任何给定的时间看到一个对象。

详细了解如何在MSDN

上向画布添加控件