2012-05-03 4 views
1

У меня есть DrawingVisual вроде этого:Как получить DrawingVisual площадь

Rect MyRect = new Rect(new Point(0, 0), new Size(100, 100)); 
DrawingVisual MyVisual = new DrawingVisual(); 

using (DrawingContext context = MyVisual.RenderOpen()) { 
context.DrawRectangle(Brushes.Black, new Pen(), MyRect); 
context.PushTransform(new TranslateTransform(50, 50)); 
context.PushTransform(new ScaleTransform(2, 2)); 
} 

Я хочу, чтобы получить Geometry, который описывает область элемента, в данном случае RectangleGeometry где Rect свойство:

Rect(new Point(50, 50), new Size(200, 200)) 

Спасибо.

ответ

3

Если бы раздвинуть преобразования, прежде чем рисовать Rect, вы могли бы получить соответствующие оценки со стороны ContentBounds собственности:

Rect rect = new Rect(new Size(100, 100)); 

using (DrawingContext dc = visual.RenderOpen()) 
{ 
    dc.PushTransform(new TranslateTransform(50, 50)); 
    dc.PushTransform(new ScaleTransform(2, 2)); 
    dc.DrawRectangle(Brushes.Black, null, rect); 
} 

System.Diagnostics.Trace.TraceInformation("Bounds = {0}", visual.ContentBounds); 

В разделе Замечания в PushTransform:

Преобразование относится все последующие команды рисования до тех пор, пока он не будет удален командой Pop.

+0

, похоже, работает, но в моем приложении есть некоторые случаи, когда есть странное поведение (результат {0,0,300,300}). См. [Мой вопрос] (http://stackoverflow.com/questions/10451066/visuals-hit-testing), пожалуйста. – gliderkite

+0

Изменен ответ на использование ContentBounds вместо DescendantBounds. Извините, но я смутил двух. Разве это имеет значение? – Clemens

+0

Я попробую, я должен решить проблему другого параллельного вопроса. – gliderkite

Смежные вопросы