2014-04-04 105 views
3

有誰知道是否有可能將DrawingContext保存或轉換爲Geometry將DrawingContext轉換爲幾何?

E.g.之後

using (DrawingContext dc = RenderOpen()) 
{ 
    dc.DrawLine(penSelected, Data.MidTop, Data.MidTop + vertical); 
    dc.DrawLine(pen, Data.MidTop - horizontal, Data.MidTop + thickness); 
    dc.DrawLine(pen, Data.MidTop + vertical - thickness, Data.MidTop + horizontal + vertical); 
    dc.DrawText(new FormattedText(Data.Time2.ToString("0.0"), cultureinfo, FlowDirection.LeftToRight, typeface, 8, Brushes.Black), 
     Data.MidTop + 3 * thickness); 
    dc.DrawText(new FormattedText(Data.Time2.ToString("0.0"), cultureinfo, FlowDirection.LeftToRight, typeface, 8, Brushes.Black), 
     Data.MidTop + vertical - horizontal - 3 * thickness); 
} 

以某種方式將繪製的對象保存在幾何中?

+2

問題是如何從DrawingVisual中的所有繪製內容中獲取單個幾何? – Clemens

回答

8

當您使用可視內容填充DrawingVisual時,您正在有效地創建一個Drawing對象的分層集合,DrawingVectual的Drawing屬性(DrawingGroup類型)可訪問這些對象。每個繪圖對象的實際的以下類型之一的是:

  • GeometryDrawing
  • GlyphRunDrawing
  • ImageDrawing
  • VideoDrawing
  • DrawingGroup

其中兩個提供的屬性或方法來獲得一個幾何。顯然,GeometryDrawing具有Geometry屬性,而GlyphRunDrawing具有返回GlyphRun對象的GlyphRun屬性,該對象又具有BuildGeometry方法。此方法返回GlyphRun文本輪廓的幾何圖形。

一個靜態輔助方法從DrawingGroup創建的幾何圖形可能是這樣的:

public static Geometry CreateGeometry(DrawingGroup drawingGroup) 
{ 
    var geometry = new GeometryGroup(); 

    foreach (var drawing in drawingGroup.Children) 
    { 
     if (drawing is GeometryDrawing) 
     { 
      geometry.Children.Add(((GeometryDrawing)drawing).Geometry); 
     } 
     else if (drawing is GlyphRunDrawing) 
     { 
      geometry.Children.Add(((GlyphRunDrawing)drawing).GlyphRun.BuildGeometry()); 
     } 
     else if (drawing is DrawingGroup) 
     { 
      geometry.Children.Add(CreateGeometry((DrawingGroup)drawing)); 
     } 
    } 

    geometry.Transform = drawingGroup.Transform; 
    return geometry; 
} 

您將在DrawingVisual的Drawing屬性的值只是通過這種方法:

var geometry = CreateGeometry(visual.Drawing); 
+0

噢,當然,好。 – Gerard

+0

太好了,+1!注意,你也應該應用幾何圖形的變換,如果不是null的話。另外,爲了覆蓋另外兩個例子(圖像和視頻),您可以使用Rect屬性 - 它的正確性取決於幾何的目的。 – MaMazav

+0

@MaMazav好點。我已經添加了轉換部分。 – Clemens

相關問題