2016-03-30 162 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