(Композитный) Геометрия путаницы в C # - PullRequest
1 голос
/ 22 июня 2010

Я пытаюсь создать 1 сложную составную фигуру на InkCanvas, но я, должно быть, делаю что-то не так, как я и ожидал, а не так. Я пробовал несколько разных воплощений для достижения этой цели.

Итак, у меня есть этот метод.

    private void InkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
    {
        Stroke stroke = e.Stroke;

        // Close the "shape".
        StylusPoint firstPoint = stroke.StylusPoints[0];
        stroke.StylusPoints.Add(new StylusPoint() { X = firstPoint.X, Y = firstPoint.Y });

        // Hide the drawn shape on the InkCanvas.
        stroke.DrawingAttributes.Height = DrawingAttributes.MinHeight;
        stroke.DrawingAttributes.Width = DrawingAttributes.MinWidth;

        // Add to GeometryGroup. According to http://msdn.microsoft.com/en-us/library/system.windows.media.combinedgeometry.aspx
        // a GeometryGroup should work better at Unions.
        _revealShapes.Children.Add(stroke.GetGeometry());

        Path p = new Path();
        p.Stroke = Brushes.Green;
        p.StrokeThickness = 1;
        p.Fill = Brushes.Yellow;
        p.Data = _revealShapes.GetOutlinedPathGeometry();

        selectionInkCanvas.Children.Clear();        
        selectionInkCanvas.Children.Add(p);
    }

Но вот что я получаю: http://img72.imageshack.us/img72/1286/actual.png

Так, где я иду не так?

ТИА, Ed

1 Ответ

2 голосов
/ 22 июня 2010

Проблема в том, что геометрия, возвращаемая штрихом. GetGeometry () - это путь вокруг обводки, поэтому область, которую вы заполняете желтым цветом, является лишь серединой обводки. Вы можете увидеть это более четко, если сделать линии толще:

_revealShapes.Children.Add(stroke.GetGeometry(new DrawingAttributes() { Width = 10, Height = 10 }));

Вы можете делать все, что хотите, если вы сами преобразуете список стилусов в StreamGeometry:

var geometry = new StreamGeometry();
using (var geometryContext = geometry.Open())
{
    var lastPoint = stroke.StylusPoints.Last();
    geometryContext.BeginFigure(new Point(lastPoint.X, lastPoint.Y), true, true);
    foreach (var point in stroke.StylusPoints)
    {
        geometryContext.LineTo(new Point(point.X, point.Y), true, true);
    }
}
geometry.Freeze();
_revealShapes.Children.Add(geometry);
...