将DrawingContext转换为Geometry?

Ger*_*ard 3 wpf drawingcontext

有人知道是否有可能保存或转换DrawingContextGeometry

比如之后

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);
}
Run Code Online (Sandbox Code Playgroud)

以某种方式保存几何中绘制的对象?

Cle*_*ens 9

当您使用可视内容填充DrawingVisual时,您实际上正在创建Drawing对象的分层集合,可以通过DrawingDrawingVisual 的属性(DrawingGroup类型)访问它.这些Drawing对象中的每一个实际上都是以下类型之一:

  • GeometryDrawing
  • GlyphRunDrawing
  • ImageDrawing
  • VideoDrawing
  • DrawingGroup

其中两个提供了获取几何的属性或方法.显然,GeometryDrawing有一个Geometry属性,而GlyphRunDrawing有一个GlyphRun返回GlyphRun对象的属性,后者又有一个BuildGeometry方法.此方法返回GlyphRun文本轮廓的几何.

从DrawingGroup创建Geometry的静态辅助方法可能如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

您只需将DrawingVisual Drawing属性的值传递给此方法:

var geometry = CreateGeometry(visual.Drawing);
Run Code Online (Sandbox Code Playgroud)