¿Cómo dibujar una línea en un canvas en WPF que es de 1 píxel de espesor

Estoy usando la clase Línea para dibujar en un canvas en WPF y aunque establezco StrokeThickness = 1 , la línea muestra 2 píxeles de ancho, es casi como si el grosor mínimo fuera dos. ¿Cómo dibujar una línea que es realmente 1 píxel de espesor?

 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); 

Dos cosas:

 myLine.SnapsToDevicePixels = true; myLine.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); 

Aparte de lo que se ha sugerido, también podría ser posible que su resolución de pantalla sea más de 96 DPI. Cualquiera que sea la medida que le esté dando a WPF, por defecto, WPF siempre asumirá que 96 píxeles corresponden a 1 pulgada.

El resultado es, en una pantalla de, por ejemplo, 192 DPI (96 * 2), dibujar una línea de grosor 1 dibujará una línea con grosor de 2 píxeles.

Si este es el caso, deberás especificar explícitamente las unidades.

Intenta agregar esto:

 myLine.SnapsToDevicePixels = true; 

Eso evitará que WPF renderice “medio píxeles” para suavizar su línea.

Descubrí que esta respuesta no era suficiente, que no funciona con líneas verticales en un Encuesta: que a veces se muestra con 2 píxeles de ancho. Para solucionarlo, encuentro que necesito restringir la posición X de la línea

Usé el siguiente método en una subclase de 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; // https://stackoverflow.com/questions/2879033/how-do-you-draw-a-line-on-a-canvas-in-wpf-that-is-1-pixel-thick 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); } 

Esto no era confiable: la línea a veces se mostraba como un píxel de ancho y, a veces, dos píxeles.

Limitar el valor de x a un entero lo hizo confiable, es decir, ¡con una seguridad de dos píxeles de ancho!

  x = (int)x; 

Agregando 0.5 a eso se hizo un píxel de manera confiable:

  x = (int)x + 0.5;