为什么我的坐标(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的StartLineCap
和EndLineCap
属性,你可以从一个像素中心到另一个像素中心绘制:
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));