如何平铺图像时如何有效地使用DrawingGroup?

时间:2013-01-09 20:01:50

标签: c# wpf

我无法理解绘图组的问题。我在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)的死图像,我单击图像控件。它将偏移到一个奇怪的位置。当我继续向左上方的位置点击更多时,它会更正绘制瓷砖的位置,同时将所有其他位置移开。

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

1 个答案:

答案 0 :(得分:0)

以下是我现在要解决的问题。我有一个i7并使用了一个drawingvisuals列表。没有问题。我想在某一点上我应该使用一个绘图视觉并将每个图像添加到相同的视觉效果。问题是如果我添加一个瓷砖我必须重新打开渲染并重做所有绘图。由于我没有任何打嗝,所以我决定不把时间用在那种方法上。

以下是要复制和粘贴的代码:

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

    公共类AreaDrawingEdit:FrameworkElement {     public VisualCollection Visuals {get;组; }     const double 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文件中。 lessthan local:AreaDrawingEdit Canvas.Left =“0”Canvas.Top =“0”OpacityMask =“Black”x:Name =“areaDrawingEdit”backslashgreaterthan

  3. 享受解决方案,解决我在苦难中找出困境的痛苦。