【问题标题】:WPF Canvas will not draw correctly in loopWPF Canvas 无法在循环中正确绘制
【发布时间】:2014-07-16 14:50:02
【问题描述】:

我目前正在使用 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),它工作正常,只有循环导致问题。 为什么?

编辑: 将margin更改为SetTop & 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。看来我今天没喝咖啡了,哈哈。

【问题讨论】:

    标签: c# wpf wpf-controls


    【解决方案1】:

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

    MSDN上查看更多关于向画布添加控件的信息

    【讨论】:

    • 我使用 SetTop 和 SetLeft 对其进行了更改,但不幸的是问题仍然存在。感谢您提供有关边距和 SetTop/SetLeft 的提示,因为边距正常工作,所以我没有理会它。
    • 在您提供的图像中(我猜是日志文件),您的 x 和 y 值为 0?是对的吗?并且索引始终为0?你能把新代码贴在你设置图片的顶部和左侧吗?
    • 瓷砖保持不变(考虑为每个瓷砖使用不同的瓷砖,但结果相同),x & y 由一个类生成。我在主帖中添加了新功能和生成地图的功能
    • 我认为您的图片位置有误。你能改变这一行 Canvas.SetTop(imgAdd, y * tileHeight);到 Canvas.SetTop(imgAdd, y);和 SetLeft 类似,然后再试一次?
    • 最后这就是问题所在。我在尝试手动添加一个并检查 X & Y 变量后注意到它,它们显示了网格中的位置 (x & y / 16) 而不是正确的 x & y 值。非常感谢你。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多