StreamGeometry не получает растеризацию, когда Pen имеет DashStyle, отличный от Null - PullRequest
3 голосов
/ 26 января 2012

Я пытался создать кисть, которая рисует геометрию. Все работало нормально, пока я не попытался добавить 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;
}

Когда все сделано таким образом, ничто не обращается. Если я не использую штриховку (или устанавливаю нулевую), она работает нормально. Это также работает, если я использую StreamGeometry.Parse(geom) и сохраняю лихорадку.

Попытка позвонить sgc.Close() не помогла. В настоящее время мой единственный обходной путь - звонить:

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

что не очень приятно ...

Что мне не хватает?

1 Ответ

4 голосов
/ 26 января 2012

Это довольно увлекательная ошибка, которую вы получили, я могу подтвердить это. Некоторое копание ILSpy выявило причину: неявный вызов BeginFigure, генерируемый Geometry.Parse, устанавливает для параметра isFilled значение true, тогда как для него устанавливается значение false в явном вызове StreamGeometryContext. Измените второй параметр в sgc.BeginFigure с false на true, и пунктирные линии будут отображаться.

Синтаксис разметки пути WPF не позволяет указать, должна ли быть заполнена какая-либо отдельная фигура или нет, поэтому я полагаю, что именно поэтому парсер по умолчанию заполняет их все, чтобы быть уверенным. Но я не вижу веской причины, по которой пунктирным линиям потребуются заполненные цифры, это должно быть ошибкой WPF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...