2012-01-26 1 views
3

기하학을 그리는 브러시를 만들려고했습니다. Dashing을 셰이프에 추가하려고 할 때까지 모든 것이 잘 동작했습니다.펜에 Null 이외의 DashStyle이있을 때 래스터 화되지 않는 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; 
} 

, 아무것도 그려지지지고 :

내가 사용하고 코드입니다. 대시를 사용하지 않으면 (또는 null로 대시를 설정하면) 정상적으로 작동합니다. 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 버그 여야합니다.

관련 문제