为什么我的坐标(1,1)从(0,1)开始?

我重写了边框控件,在我的重写OnRender中我做了:

protected override void OnRender(System.Windows.Media.DrawingContext dc) { this.SnapsToDevicePixels = true; this.VisualEdgeMode = EdgeMode.Aliased; var myPen = new Pen(new SolidColorBrush(Colors.LightGray), 1); dc.DrawLine(myPen, new Point(1, 1), new Point(1, RenderSize.Height - 1)); return; 

哪个给我这个结果: 在此处输入图像描述

题:

是否有人可以告诉我为什么我的代码从(0,1)开始绘制一条线,而假设从(1,1)开始就像用代码编写的那样?

我的DPI是96,96。

对于ref,这是我的xaml:

                            

请记住, (0, 0)不是左上角像素的中心。 相反,它是该像素的左上角。 为了在第二个像素列的中间绘制行程厚度为1的行(索引为1),您必须从(1.5, 1) (1.5, RenderSize.Height - 1) (1.5, 1)绘制到(1.5, RenderSize.Height - 1)

 dc.DrawLine(myPen, new Point(1.5, 1), new Point(1.5, RenderSize.Height - 1)); 

设置SnapsToDevicePixels = true使您的线向左捕捉半个像素。


如果你将PenLineCap.Square用于线的Pen的StartLineCapEndLineCap属性,你可以从一个像素中心到另一个像素中心绘制:

 var myPen = new Pen(Brushes.LightGray, 1); myPen.StartLineCap = PenLineCap.Square; myPen.EndLineCap = PenLineCap.Square; dc.DrawLine(myPen, new Point(1.5, 1.5), new Point(1.5, RenderSize.Height - 1.5));