【发布时间】: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