将DrawingContext转换为Geometry?

3

有人知道是否存在将 DrawingContext 保存或转换为 Geometry 的可能性吗?

例如,在执行以下操作后:

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
1个回答

9
当您使用可视化内容填充DrawingVisual时,实际上正在创建一个包含Drawing对象的分层集合,这些对象可以通过DrawingVisual的Drawing属性(类型为DrawingGroup)访问。实际上,这些Drawing对象中的每一个都是以下类型之一:
- GeometryDrawing - GlyphRunDrawing - ImageDrawing - VideoDrawing - DrawingGroup 其中两个提供获取Geometry的属性或方法。显然,GeometryDrawing具有Geometry属性,而GlyphRunDrawing具有返回GlyphRun对象的GlyphRun属性,该对象又具有BuildGeometry方法。此方法返回GlyphRun文本轮廓的Geometry。
从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;
}

您只需要将DrawingVisualDrawing属性的值传递给此方法:

var geometry = CreateGeometry(visual.Drawing);

太好了,+1!请注意,如果不为空,您还应该将Drawing的变换应用于Geometry。此外,为了涵盖两种附加情况(图像和视频),您可以使用Rect属性-其正确性取决于几何形状的目的。 - MaMazav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接