Wpf 将DrawingContext转换为几何图形?

Wpf 将DrawingContext转换为几何图形?,wpf,drawingcontext,Wpf,Drawingcontext,有人知道是否有可能将绘图上下文保存或转换为几何体 例如,在 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 + ve

有人知道是否有可能将
绘图上下文
保存或转换为
几何体

例如,在

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);
}

要以某种方式将绘制的对象保存在几何图形中?

当您使用视觉内容填充DrawingVisual时,您实际上是在创建图形对象的层次集合,这些对象可由DrawingVisual的
Drawing
属性(DrawingGroup类型)访问。这些图形对象实际上属于以下类型之一:

  • 几何制图
  • 图形绘制
  • 图像绘制
  • 录像画
  • 绘图组
其中两个提供了获取几何体的属性或方法。显然,GeometryDrawing有一个
Geometry
属性,而GlyphRunDrawing有一个
GlyphRun
属性,该属性返回一个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);

问题是如何从DrawingVisual中的所有绘制内容中获取一个几何体?太好了,+1!请注意,如果不是null,还应在几何图形上应用图形的变换。此外,为了涵盖另外两种情况(图像和视频),您可以使用Rect属性-其正确性取决于几何体的用途。