Пользовательский рисунок линии в WPF - PullRequest
2 голосов
/ 22 июля 2011

Я пытаюсь нарисовать линию вручную в WPF, переопределив метод OnRender элемента управления и вызвав метод DrawLine для данного DrawingContext.Я где-то читал, что этот вызов метода не сразу рисует линию, но я не могу понять, как на самом деле вызвать появление линии.

Я пытался использовать комбинацию PathGeometry, LineSegments, Lineи полилинии управления.Я мог нарисовать то, что хотел тогда, но смещения были не совсем правильными (т.е. при рисовании линии было хорошо, когда при рисовании ломаной линии все становилось неправильно смещенным).

Любой совет по этому вопросу был бы хорош.

РЕДАКТИРОВАТЬ

Pen Code

    private static readonly Pen LinePen = new Pen(new SolidColorBrush(Colors.Green), 3.0d);
    private static readonly Pen WayPointPen = new Pen(new SolidColorBrush(Colors.Gray), 3.0d);

Render Code

    protected override void OnRender(DrawingContext drawingContext)
    {
        // Draw way points
        this.DrawWayPoints(drawingContext);

        if (mDrawing)
        {
            // Draw current line
            this.DrawCurrentLine(drawingContext);
        }
    }

    private void DrawCurrentLine(DrawingContext context)
    {
        if(mStartPoint.HasValue && mEndPoint.HasValue)
        {
            // Draw the line
            context.DrawLine(LinePen, mStartPoint.Value, mEndPoint.Value);
        }
    }

    private void DrawWayPoints(DrawingContext context)
    {
        if (mWayPoints.Count < 2)
        {
            return;
        }

        // Draw all points
        for (int i = 0; i < mWayPoints.Count - 1; i++)
        {
            var start = mWayPoints[i];
            var end = mWayPoints[i + 1];

            // Draw the line
            context.DrawLine(WayPointPen, start, end);
        }
    }

РЕДАКТИРОВАТЬ

Тестовый проект: http://dl.dropbox.com/u/12763956/DrawingTest.zip (Тестовый проект, написанный в Visual Studio 2010)

Использование: - Щелчок левой кнопкой мыши в поднятой областидобавить точки в список.- Щелкните правой кнопкой мыши, чтобы закончить рисование и очистить точки.

Примечание. Пользовательские нарисованные линии (в переопределении OnRender) не отображаются.

1 Ответ

2 голосов
/ 26 июля 2011

Здесь на самом деле есть две проблемы. Во-первых, фон вашего Canvas скрывает все, что вы рисуете в DrawingControl. Поэтому, если вы установите для параметра «Фон холста» значение «Прозрачный», вы можете временно обойти эту проблему.

Вторая проблема заключается в том, что вам нужно позвонить InvalidateVisual после добавления точки в коллекцию, чтобы заставить ее перерисовать.

Возможно, вам понадобится добавить еще один элемент управления, отображаемый в верхней части холста, и отобразить линии там. Или вам нужно будет отрисовать фон самостоятельно в методе DrawingControl.OnRender.

...