如何在WPF中的画布上绘制1像素厚的线条

cbeh67ev  于 2023-11-21  发布在  其他
关注(0)|答案(5)|浏览(156)

我使用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);

字符串

xpcnnkqh

xpcnnkqh1#

两件事:

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

字符串

uubf1zoe

uubf1zoe2#

尝试添加以下内容:

myLine.SnapsToDevicePixels = true;

字符串
这将阻止WPF渲染“半像素”来消除线条的锯齿。

vyu0f0g1

vyu0f0g13#

除了已经建议的之外,您的屏幕分辨率也可能超过96 DPI。无论您给WPF提供什么测量值,默认情况下WPF将始终假设96像素对应于1英寸。
结果是,在192 DPI(96 * 2)的屏幕上,绘制厚度为1的线条将绘制厚度为2像素的线条。
如果是这种情况,则必须明确指定单位。

wwodge7n

wwodge7n4#

我发现this answer是不够的,它不适用于画布上的垂直线:有时显示为2像素宽。
我在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;

r8xiu3jd

r8xiu3jd5#

如果您希望一条线从其画布的边缘开始(例如Y1 = 0),那么简单地在每条线上设置SnapsToDevicePixels并不是一个好的解决方案,因为线将捕捉到设备像素,但画布可能不会,从而导致画布的半像素(例如画布背景色)在线外部可见。
相反,您可以简单地在画布上设置SnapsToDevicePixels=“True”。这还有一个优点,即 * 您不再需要在每条线上设置SnapsToDevicePixels *。

相关问题