【问题标题】:How do you draw a line on a canvas in WPF that is 1 pixel thick如何在 WPF 中的画布上画一条 1 像素厚的线
【发布时间】:2010-05-21 01:22:54
【问题描述】:
我正在使用 Line 类在 WPF 中的画布上绘制,即使我设置了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);
【问题讨论】:
标签:
c#
wpf
visual-studio-2010
line
【解决方案1】:
两件事:
myLine.SnapsToDevicePixels = true;
myLine.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);
【解决方案2】:
尝试添加这个:
myLine.SnapsToDevicePixels = true;
这将阻止 WPF 呈现“半像素”以消除线条的锯齿。
【解决方案3】:
除了建议的内容外,您的屏幕分辨率也有可能超过 96 DPI。无论您为 WPF 提供什么测量值,默认情况下 WPF 将始终假定 96 像素对应于 1 英寸。
结果是,在 192 DPI (96 * 2) 的屏幕上,绘制一条粗细为 1 的线将绘制一条粗细为 2 像素的线。
如果是这种情况,您必须明确指定单位。
【解决方案4】:
我发现this answer 不够用,它不适用于画布上的垂直线:有时显示为 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;