2016-03-30 164 views
0

我想畫一個矩形成圖像:DrawingContext.DrawRectangle繪製一個矩形

<Canvas> 
    <Image> 
     <Image.Source> 
      <DrawingImage> 
       <DrawingImage.Drawing> 
        <DrawingGroup x:Name="_drawingGroup" /> 
       </DrawingImage.Drawing> 
      </DrawingImage> 
     </Image.Source> 
    </Image> 
</Canvas> 

C#代碼看起來像:

DrawingVisual visual = new DrawingVisual(); 
using (DrawingContext dc = visual.RenderOpen()) 
{ 
    Rect rect = new Rect(new Point(100, 100), new Size(200, 100)); 
    dc.DrawRectangle(Brushes.Blue, null, rect); 
} 

this._drawingGroup.Children.Add(visual.Drawing); 
this._drawingGroup.Freeze(); 

正如你所看到的,我打算用左上角繪製一個矩形(100,100)。但它不像預期的那樣工作 - 它總是在(0,0)處繪製。我怎麼了?

+0

左上角?你的畫布? –

回答

0

DrawingImage將其Drawing與圖形的可見Bounds對齊。

作爲一種解決方法,您可以在(0,0)處添加一個原點爲透明的矩形。還要注意的是,你並不需要一個DrawingVisual創建繪圖:

drawingGroup.Children.Add(new GeometryDrawing(
    Brushes.Transparent, null, 
    new RectangleGeometry(new Rect(0, 0, 1, 1)))); 

drawingGroup.Children.Add(new GeometryDrawing(
    Brushes.Blue, null, 
    new RectangleGeometry(new Rect(100, 100, 200, 100)))); 

drawingGroup.Freeze(); 

到圖像控制的替代與DrawingImage可能是(足夠大)矩形用DrawingBrush:

<Rectangle Width="10000" Height="10000"> 
    <Rectangle.Fill> 
     <DrawingBrush ViewboxUnits="Absolute" Viewbox="0,0,10000,10000"> 
      <DrawingBrush.Drawing> 
       <DrawingGroup x:Name="drawingGroup" /> 
      </DrawingBrush.Drawing> 
     </DrawingBrush> 
    </Rectangle.Fill> 
</Rectangle> 

現在你可以創建你喜歡畫意:關於什麼

drawingGroup.Children.Add(new GeometryDrawing(
    Brushes.Blue, null, 
    new RectangleGeometry(new Rect(100, 100, 200, 100)))); 

drawingGroup.Freeze(); 
+0

我發佈的代碼只是一個簡化版本,我無法更改所有代碼結構。 DrawingVisual也是必要的,因爲我會在其中製作複雜的圖紙。添加透明矩形(0,0,1,1)的解決方法對我來說似乎是可行的。有沒有更好的方法,例如,是否可以更改DrawingImage的某些屬性以保持邊界? – sspine

+0

我懷疑是否有任何只能使用DrawingContext創建的繪圖,而不是直接創建適當的繪圖對象。 – Clemens