Как нарисовать линию на холсте в WPF толщиной 1 пиксель - PullRequest
19 голосов
/ 21 мая 2010

Я использую класс Line для рисования на холсте в WPF, и хотя я установил StrokeThickness = 1, линия показывает ширину 2 пикселя - почти как минимальная толщина равна двум. Как нарисовать линию толщиной 1 пиксель?

Line myLine = new Line();

myLine.Stroke = System.Windows.Media.Brushes.Black;

myLine.X1 = 100;
myLine.X2 = 140;  // 150 too far
myLine.Y1 = 200;
myLine.Y2 = 200;

myLine.StrokeThickness = 1;

graphSurface.Children.Add(myLine);

Ответы [ 4 ]

35 голосов
/ 21 мая 2010

Две вещи:

myLine.SnapsToDevicePixels = true;
myLine.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);
5 голосов
/ 21 мая 2010

Помимо того, что было предложено, также возможно, что ваше разрешение экрана превышает 96 DPI. Какие бы измерения вы ни делали для WPF, по умолчанию WPF всегда будет считать, что 96 пикселей соответствуют 1 дюйму.

В результате на экране, скажем, 192 DPI (96 * 2), рисование линии толщиной 1 нарисует линию толщиной 2 пикселя.

Если это так, вам придется явно указать единицы измерения.

5 голосов
/ 21 мая 2010

Попробуйте добавить это:

myLine.SnapsToDevicePixels = true;

Это остановит WPF от рендеринга «половины пикселей» для сглаживания вашей линии.

0 голосов
/ 19 апреля 2018

Я обнаружил, что этого ответа недостаточно, что он не работает для вертикальных линий на Canvass: который иногда отображается как 2 пикселя в ширину. Чтобы исправить это, мне нужно ограничить положение X линии

Я использовал следующий метод в подклассе Canvass:

    Line newLine(double x1, double x2, double y1, double y2, Brush brush)
    {
        Line line = new Line();
        line.X1 = x1;
        line.X2 = x2;
        line.Y1 = y1;
        line.Y2 = y2;

        line.StrokeThickness = 1;
        line.Stroke = brush;

        // /2119668/kak-narisovat-liniy-na-holste-v-wpf-tolschinoi-1-piksel
        line.SnapsToDevicePixels = true;
        line.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);

        base.Children.Add(line);

        return line;
    }

    internal void ShowVertical(double x)
    {
        Line line = newLine(0, 0, 50, 150, Brushes.Red);
        SetLeft(line, x);
    }

Это было ненадежно: строка иногда отображалась шириной в один пиксель, а иногда и двумя пикселями.

Ограничение значения x целым числом сделало его надежным - т.е. надежно шириной в два пикселя!

        x = (int)x;

Добавление 0.5 к этому сделало его надежно одним пикселем:

        x = (int)x + 0.5;
...