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

A 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, но не путем прямого создания соответствующих объектов Drawing. – Clemens