【问题标题】: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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-21
          • 2017-04-02
          • 2021-01-26
          • 2018-01-29
          • 1970-01-01
          • 1970-01-01
          • 2014-01-30
          • 1970-01-01
          相关资源
          最近更新 更多