当笔具有除Null以外的DashStyle时,StreamGeometry未被光栅化

本文关键字:StreamGeometry DashStyle Null | 更新日期: 2023-09-27 18:21:32

我试图创建一个绘制几何体的笔刷。一切都很好,直到我尝试在形状中添加Dashing。

我发现,当我使用geometry.Parse创建几何体时,虚线显示正确,但当我直接使用StreamGeometryContext创建它时,什么都不会渲染。

这是我正在使用的代码:

private void RenderGeometryAndSetAsBackground()
{
    Point startPoint = new Point(3505961.52400725, 3281436.57325874);
    Point[] points = new Point[] {
        new Point(3503831.75515445,3278705.9649394),
        new Point(3503905.74802898,3278449.37713916),
        new Point(3507242.57331039,3276518.41148474),
        new Point(3507700.6914325,3276536.23547958),
        new Point(3510146.73449577,3277964.12812859),
        new Point(3509498.96473447,3278678.60178448),
        new Point(3507412.1889951,3277215.64022219),
        new Point(3504326.22698001,3278682.85514017),
        new Point(3506053.34789057,3281390.66371786)};
    string geom = "M3505961.52400725,3281436.57325874L3503831.75515445,3278705.9649394 3503905.74802898,3278449.37713916 3507242.57331039,3276518.41148474 3507700.6914325,3276536.23547958 3510146.73449577,3277964.12812859 3509498.96473447,3278678.60178448 3507412.1889951,3277215.64022219 3504326.22698001,3278682.85514017 3506053.34789057,3281390.66371786";
    //Geometry geometry = StreamGeometry.Parse(geom);
    StreamGeometry geometry = new StreamGeometry();
    using (StreamGeometryContext sgc = geometry.Open())
    {
        sgc.BeginFigure(startPoint, false, true);
        foreach (Point p in points)
        {
            sgc.LineTo(p, true, true);
        }
    }
    Pen pen = new Pen(Brushes.Yellow, 3);
    pen.DashStyle = new DashStyle(new double[] { 30, 30 }, 0);
    //GeometryDrawing gd = new GeometryDrawing(null, pen, path.RenderedGeometry);
    GeometryDrawing gd = new GeometryDrawing(null, pen, geometry);
    DrawingBrush drawingBrush = new DrawingBrush(gd);
    DrawingBrush tile = drawingBrush.Clone();
    tile.Viewbox = new Rect(0.5, 0, 0.25, 0.25);
    RenderTargetBitmap rtb = new RenderTargetBitmap(256, 256, 96, 96, PixelFormats.Pbgra32);
    var drawingVisual = new DrawingVisual();
    using (DrawingContext context = drawingVisual.RenderOpen())
    {
        context.DrawRectangle(tile, null, new Rect(0, 0, 256, 256));
    }
    rtb.Render(drawingVisual);
    ImageBrush bgBrush = new ImageBrush(rtb);
    Background = bgBrush;
}

这样做,什么也画不出来。如果我不使用dashing(或将dashing设置为null),它可以正常工作。如果我使用StreamGeometry.Parse(geom)并保持潇洒,它也会起作用。

尝试呼叫sgc.Close()没有帮助。目前,我唯一的解决方法是拨打:

geometry = Geometry.Parse(geometry.ToString());

这不是很好。。。

我错过了什么?

当笔具有除Null以外的DashStyle时,StreamGeometry未被光栅化

这是一个非常有趣的错误,我可以证实。一些ILSpy挖掘揭示了原因:Geometry生成的隐式BeginFigure调用。Parse将isFilled参数设置为true,而您在显式StreamGeometryContext调用中将其设置为false。更改sgc中的第二个参数。BeginFigure从false变为true,虚线将呈现。

WPF路径标记语法不允许指定是否应该填充任何单个图形,所以我想这就是为什么解析器默认填充所有图形的原因,只是为了确定。但我看不出有什么好的理由说明为什么虚线需要填写数字,这一定是WPF的一个错误。