0

我无法理解绘图组的问题。我正在 wpf 中创建一个地图编辑器,这是我的第一个 wpf 项目,我一直在搜索/玩绘图组。

我在左侧有一组图块,在应用程序启动时根据精灵文件夹填充这些图块。它们都根据我设置的规则进行布局(每行 3 组图块,每组 32 像素)。下面的例子:

    private void RefreshTileList()
    {
        // For now load in all textures as possible tiles
        DrawingGroup dGroup = new DrawingGroup();
        Rect r = new Rect();
        r.X = 0.0;
        r.Y = 0.0;
        r.Width = Settings.Default.TileThumbWidth;
        r.Height = Settings.Default.TileThumbHeight;
        foreach (WPFTexture tex in imgFind.TileTextures)
        {
            ImageDrawing iDraw = new ImageDrawing(tex.src, r);

            dGroup.Children.Add(iDraw);

            r.X += r.Width;
            if (r.X > r.Width * Settings.Default.TileThumbMaxColumns)
            {
                r.X = 0.0;
                r.Y += r.Height;
            }
        }

        // Make a drawing image and send it to the Image in canvas
        DrawingImage drawImage = new DrawingImage(dGroup);
        tileImage.Source = drawImage;
    }

现在我在另一个画布中进行图像控制,除了动态放置图块之外,我想做同样的事情。这是我到目前为止所拥有的:

    private void AreaDrawingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if(curSelIndex > -1 && curSelIndex < imgFind.TileTextures.Count)
        {
            BitmapSource tileSrc = imgFind.TileTextures[curSelIndex].src;

            Point mousePos = e.GetPosition(sender as Canvas);
            Size size = new Size(tileSrc.Width, tileSrc.Height);
            Rect r = new Rect(mousePos, size);
            ImageDrawing iDraw = new ImageDrawing(tileSrc, r);

            areaDrawGroup.Children.Add(iDraw);

        }
    }

这是使用 areaDrawGroup 的初始化:

        // Setup drawing for area
        DrawingImage areaDrawImage = new DrawingImage(areaDrawGroup);
        areaImage.Source = areaDrawImage;
        areaImage.Stretch = Stretch.None;
        AreaDrawingCanvas.Children.Add(areaImage);

如果我不添加位于绘图组中点 (0, 0) 的死图像,然后单击图像控件。它将偏移到一个奇怪的位置。当我继续单击左上角位置时,它会更正绘制瓷砖的位置,同时将所有其他瓷砖移过来。

我的问题是我在哪里可以找到一个好的平铺示例或者我做错了什么?因为添加一个死图像来修复其他图像所在的位置似乎对我错过的一些简单的东西来说是一个非常糟糕的黑客攻击。

4

1 回答 1

0

这是我现在为解决这个问题所做的。我有一个 i7 并使用了一个绘图视觉列表。不要有问题。我曾想过我应该使用一个绘图视觉并将每个图像添加到同一个视觉。这样做的问题是,如果我添加一个图块,我必须重新打开渲染并重做所有绘图。因为我没有任何问题,所以我决定不把时间花在那个方法上。

这是复制和粘贴的代码:

  1. 创建一个派生框架元素的类并添加覆盖,如图所示

    公共类 AreaDrawingEdit : FrameworkElement { public VisualCollection Visuals { get; 放; } 常量双 COLLISION_OPACITY = 0.8;

    public AreaDrawingEdit()
    {
        Visuals = new VisualCollection(this);
    }
    
    public void AddRenderTile(DrawingTile tile)
    {
        // Add the tile visual 
        tile.visual = new DrawingVisual();
        InvalidateTile(tile);
        Visuals.Add(tile.visual);
    
        // Add in collision visual
        tile.colVol.visual = new DrawingVisual();
        InvalidateCollisionVol(tile.colVol);
        Visuals.Add(tile.colVol.visual);
    }
    
    public void RemoveRenderTile(DrawingTile tile)
    {
        Visuals.Remove(tile.visual);
        Visuals.Remove(tile.colVol.visual);
    }
    
    public void InvalidateTile(DrawingTile tile)
    {
        // Set up drawing rect for new tile
        Rect r = new Rect(tile.pos, new Size(tile.tileTex.src.PixelWidth, tile.tileTex.src.PixelHeight));
    
        DrawingContext dc = tile.visual.RenderOpen();
        dc.DrawImage(tile.tileTex.src, r);
        dc.Close();
    }
    
    public void InvalidateCollisionVol(CollisionVol vol)
    {
        Rect r = new Rect(vol.pos, vol.size);
    
        DrawingContext dc = vol.visual.RenderOpen();
        dc.PushOpacity(COLLISION_OPACITY);
        dc.DrawImage(vol.src, r);
        dc.Pop();
        dc.Close();
    }
    
    protected override int VisualChildrenCount
    {
        get { return Visuals.Count; }
    }
    
    protected override Visual GetVisualChild(int index)
    {
        if (index < 0 || index >= Visuals.Count)
        {
            throw new ArgumentOutOfRangeException();
        }
    
        return Visuals[index];
    }
    

    }

  2. 在某处将您制作的框架元素添加到您的 xaml 文件中。小于本地:AreaDrawingEdit Canvas.Left="0" Canvas.Top="0" OpacityMask="Black" x:Name="areaDrawingEdit" 反斜杠大于

享受解决我难以解决的痛苦的方法。

于 2013-01-29T18:26:26.443 回答