如何在WPF中在1像素厚的canvas上绘制一条线
我正在使用Line类在WPF中的canvas上绘制,即使我设置StrokeThickness = 1
,该行显示2像素宽 – 这几乎就像最小厚度是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);
两件事情:
myLine.SnapsToDevicePixels = true; myLine.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);
除了建议之外,您的屏幕分辨率可能超过96 DPI。 无论你给WPF做什么测量,默认情况下WPF总是假设96像素对应1英寸。
结果是,在192 DPI(96 * 2)的屏幕上,绘制厚度为1的线将绘制厚度为2像素的线。
如果是这种情况,则必须明确指定单位。
尝试添加此:
myLine.SnapsToDevicePixels = true;
这将阻止WPF渲染“半像素”以对抗你的线。
我发现这个答案是不够的,它不适用于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; // 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); }
这是不可靠的:线有时显示为一个像素宽,有时两个像素。
将x
值约束为整数使其可靠 – 即可靠地两个像素宽!
x = (int)x;
添加0.5
使其可靠地成为一个像素:
x = (int)x + 0.5;