簡體   English   中英

如何在WPF中在1像素厚的畫布上繪制一條線

[英]How do you draw a line on a canvas in WPF that is 1 pixel thick

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

兩件事情:

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

嘗試添加此:

myLine.SnapsToDevicePixels = true;

這將阻止WPF渲染“半像素”以對抗你的線。

除了建議之外,您的屏幕分辨率也可能超過96 DPI。 無論你給WPF做什么測量,默認情況下WPF總是假設96像素對應1英寸。

結果是,在192 DPI(96 * 2)的屏幕上,繪制厚度為1的線將繪制厚度為2像素的線。

如果是這種情況,則必須明確指定單位。

我發現這個答案是不夠的,它不適用於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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM