如何从Path中提取ArcSegment和LineSegment而非PolylineSegment?
解决方法
问题出在你调用了GetFlattenedPathGeometry()方法——这个方法的核心作用就是把路径里的所有曲线(包括圆弧)都转换成由直线段构成的折线,所以得到的只能是PolylineSegment,自然会丢失原始的ArcSegment和LineSegment信息。
要获取路径的原始片段,直接访问Path.Data对应的原始几何结构即可,不需要做扁平化处理:
var geometry = snappedPath.Data as PathGeometry; if (geometry != null) { var figure = geometry.Figures[0]; foreach (var segment in figure.Segments) { if (segment is ArcSegment arcSeg) { // 提取圆弧数据,比如半径、圆弧方向等 var arcRadius = arcSeg.Size; var isLargeArc = arcSeg.IsLargeArc; var sweepDir = arcSeg.SweepDirection; // 按需处理其他圆弧属性 } else if (segment is LineSegment lineSeg) { // 处理直线段端点数据 var lineEndPoint = lineSeg.Point; // 按需处理直线段逻辑 } } }
如果snappedPath.Data是StreamGeometry类型,需要先将其转换为PathGeometry才能访问内部片段:
if (snappedPath.Data is StreamGeometry streamGeo) { PathGeometry pathGeo = new PathGeometry(); using (var ctx = streamGeo.Open()) { streamGeo.FillWithContext(ctx); } // 后续操作pathGeo.Figures和Segments即可获取原始片段 var figure = pathGeo.Figures[0]; foreach (var segment in figure.Segments) { // 类型判断与处理逻辑同前 } }
核心原则就是不要使用扁平化方法,直接操作路径的原始几何结构,这样就能完整保留所有原始线段类型。
内容的提问来源于stack exchange,提问作者HillbillyHarry
相关产品推荐
相关产品推荐

