2012-01-26 24 views
3

我试图创建绘制几何图形的笔刷。一切工作正常,直到我试图添加Dashing的形状。当笔具有DashStyle而非Null时,StreamGeometry不会被栅格化

我发现当我使用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; 
} 

当这样做的方式,没有什么是越来越绘制。如果我不使用冲刺(或将冲刺设置为空),它可以正常工作。如果我使用StreamGeometry.Parse(geom)并保持速度,它也可以。

试图拨打sgc.Close()没有帮助。目前我唯一的解决方法是调用:

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

这是不是很不错...

我缺少什么?

回答

4

这是一个非常迷人的错误,你到了那里,我可以证实它。一些ILSpy挖掘揭示了原因:由Geometry.Parse生成的隐式BeginFigure调用将isFilled参数设置为true,而在显式StreamGeometryContext调用中将其设置为false。将sgc.BeginFigure中的第二个参数从false更改为true,并且将渲染虚线。

WPF路径标记语法不允许指定是否应该填充任何单个图形,所以我想这就是为什么解析器默认将它们全部填满,只是为了确定。但我看不到任何充分的理由,为什么虚线需要填充数字,这必须是一个WPF错误。

相关问题