2013-01-09 28 views
0

我无法理解绘图组的问题。我在wpf中创建了一个地图编辑器,这是我的第一个wpf项目,我一直在寻找/使用绘图组。如何在平铺图像时有效地使用DrawingGroup?

我有一组应用程序启动时填入基于关闭精灵的文件夹的左侧瓦片。它们都按照我设定的规则进行布局(每行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)死图像添加绘图组和我点击图像控件。它将抵消一个奇怪的位置。当我继续点击左上角的位置时,它会更正它在哪里绘制图块,同时将所有其他图块移动过来。

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

+0

我有一个类似的问题而回它原来是在画布上的'ClipToBounds'财产,我不能remeber如果我设置为true或false,但这并解决我的问题,尝试在你的'AreaDrawingCanvas设置此' –

+0

对那个不利。我把它设置为true,不在滚动条下绘制内容(但我确实关闭了它)。 我试图从鼠标位置减去100,并在零零点击。黑客破裂。看起来在图像控制中,我根本不可能有任何小于0的孩子。即使当我用Canvas移动画布中的图像时,它也会出现毛刺,好像我无法做到。 – riekistyx

回答

0

这里是我做过什么来解决这个现在。我有一个i7并使用了一个可视图表列表。不要有问题。我认为我应该使用一个绘图视觉,并将每个图像添加到相同的视觉。这个问题是,如果我添加一个瓷砖,我必须重新打开渲染并重做所有的绘图。由于我没有任何打嗝,我决定不用我的时间用这种方法。

这里是代码复制并粘贴:

  1. 作出这样的派生框架元素的类,并在重写添加为看到

    公共类AreaDrawingEdit:FrameworkElement的 { 公共VisualCollection视觉效果{得到;组; } 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文件所做的某处框架元素的东西。 每种不超过本地:AreaDrawingEdit Canvas.Left = “0” Canvas.Top = “0” OpacityMask = “黑色” X:NAME = “areaDrawingEdit” backslashgreaterthan

享受解决我想出来了痛苦的艰辛的道路。