C# 使用DrawingVisual渲染1像素线

C# 使用DrawingVisual渲染1像素线,c#,wpf,C#,Wpf,我见过几个在WPF中渲染1像素线的例子,但没有一个适用于我的情况。我正在使用DrawingVisual和DrawingContext绘制一些形状,并使用RenderTargetBitmap和PngBitmapEncoder生成图像。在许多情况下,矩形的边框为2像素,即使我将其设置为1。我猜这是由于使用了与分辨率无关的渲染 我已经找到了几种解决方案,但它们要么在XAML中,要么应用于绘图控件。我找到的最接近的东西是XSnappingGuidelines/YSnappingGuidelines,但我

我见过几个在WPF中渲染1像素线的例子,但没有一个适用于我的情况。我正在使用DrawingVisual和DrawingContext绘制一些形状,并使用RenderTargetBitmap和PngBitmapEncoder生成图像。在许多情况下,矩形的边框为2像素,即使我将其设置为1。我猜这是由于使用了与分辨率无关的渲染

我已经找到了几种解决方案,但它们要么在XAML中,要么应用于绘图控件。我找到的最接近的东西是XSnappingGuidelines/YSnappingGuidelines,但我找不到一个关于如何使用它的示例。关于这些属性的文档非常缺乏

如何禁用DrawingVisual的分辨率独立渲染

更新: 以下是我试图做的:

声明一个DrawingVisual:

DrawingVisual mainTemplate = new DrawingVisual();
获取上下文:

using (DrawingContext context = mainTemplate.RenderOpen())
绘制矩形:

penToUse = new Pen(new SolidColorBrush(Color.FromRgb(0xFF, 0xFF, 0xFF)), 1.0);
penToUse.DashStyle = DashStyles.Dash;
context.DrawRectangle(brushToUse, penToUse, new Rect(left, top, width, height));
在何处将渲染模式设置为与像素对齐


jorj

我最接近能够在WPF中使用DrawingContext渲染单像素线条的地方是:

GuidelineSet guidelines = new GuidelineSet();
guidelines.GuidelinesX.Add(_bgRect.Left - 0.5);
guidelines.GuidelinesX.Add(_bgRect.Right + 0.5);
guidelines.GuidelinesY.Add(_bgRect.Top - 0.5);
guidelines.GuidelinesY.Add(_bgRect.Bottom + 0.5);
dc.PushGuidelineSet(guidelines);
dc.DrawRectangle(Background, _outlinePen, _bgRect);
if (BorderThickness.Left > 1)
    dc.DrawLine(_leftPen, _bgRect.TopLeft, _bgRect.BottomLeft);
if (BorderThickness.Top > 1)
    dc.DrawLine(_topPen, _bgRect.TopLeft, _bgRect.TopRight);
if (BorderThickness.Right > 1)
    dc.DrawLine(_rightPen, _bgRect.TopRight, _bgRect.BottomRight);
if (BorderThickness.Bottom > 1)
    dc.DrawLine(_bottomPen, _bgRect.BottomRight, _bgRect.BottomLeft);
dc.Pop();

在WPF中,绘制直线时,该直线以指定的坐标为中心。因此,如果在具有96 DPI的设备上,您从10,10到10,20绘制一条垂直线,并且笔的宽度为1,那么该线实际上将在9.5到10.5之间绘制,取两个像素。如果要对齐像素边缘上的线,需要将其偏移0.5。在120 DPI显示器上,线条的宽度应为0.8以获取单个像素,您需要将其移动0.4以在像素边缘对齐


您不必使用GuidelineSet,因为它所做的只是简单的移位,但不必要地使代码复杂化

如果您可以发布一些示例代码,这将非常有用。请注意,在XAML中可能的任何内容在代码中都是可能的。当您使用矩形时,您是否将BorderThickness设置为仅使用一面?比如“0,1,0,0”。否则你会把所有的边都画出来,这很有趣。使用指南时,必须增加或减少一半的笔宽。不管你加还是减,两者都有效。但使用钢笔的坐标却不行。奇怪。使用指南可能与DPI无关?在使用相同的值定义了所有笔宽和对准则的更正(请参见上面的注释)之后。抱歉,但DPI对WPF的影响确实令人困惑。我想不只是对我来说:-)