簡體   English   中英

WPF畫布將無法正確循環繪制

[英]WPF Canvas will not draw correctly in loop

我目前正在使用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個圖塊,具體取決於畫布的大小)。 點擊例如

嘗試手動添加它們(MouseEvent)時,它工作正常,只有循環會引起問題。 為什么?

編輯:將邊距更改為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。好像我今天想念咖啡,哈哈。

您不應該使用邊距將項目放置在畫布上。 您必須使用Canvas.SetTop和Canvas.SetLeft設置圖像的位置。 我猜您所有的圖像都添加到了畫布上,但是位於同一位置,因此您在任何給定時間只能看到一個對象。

查看有關在MSDN上向畫布添加控件的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM