2013-01-09 26 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

享受解決我想出來了痛苦的艱辛的道路。