我正在尝试在装饰器的子类中做简单的绘图,类似于他们在这里做的…
如何在wpf中绘制具有方角的边框?
…除了边框厚度是单像素,而不是两个像素。然而,无论我做什么,WPF决定它需要做它的"平滑"(例如,它不是渲染一个单像素的线,而是渲染一个两像素的线,每个"一半"大约50%的不透明度。)换句话说,它在尝试对图像进行反混叠。我不想要抗锯齿绘图。我想说,如果我画一条从0,0到10,0的线,我会得到一条单像素宽的线,正好是10像素长,没有平滑。
现在我知道WPF是这样做的,但我认为这就是他们引入SnapsToDevicePixels和uselayoutrounound的具体原因,这两个我都在XAML中设置为"True"。我还确保我使用的数字是实际的整数,而不是小数,但我仍然没有得到我所希望的漂亮,清晰,一像素宽的线条。
帮助! !
马克Aaaaah....得到它!WPF认为从0,0到10,0的行实际上是在该逻辑行上,而不是像GDI中那样的像素行。为了更好地解释,可以把WPF中的坐标看作是在一张方格纸上绘制的线的代表,而像素是这些线组成的正方形(假设是96 DPI)。如果它们不同,您需要进行相应的调整。
所以…为了使绘图参考像素位置,我们需要将绘图从线本身移动到像素(方格纸上的正方形)的中心,因此我们将所有绘图移动0.5,0.5(再次假设DPI为96)
所以如果它是一个96 DPI设置,简单地在OnRender方法中添加它就像一个魅力…
drawingContext.PushTransform(new TranslateTransform(.5, .5));
希望这对别人有帮助!
看一下这篇文章:在物理设备像素上精确地画线
乌利希期刊指南
链接中的一些有价值的引用:
这些线看起来模糊的原因是我们的点在中心直线的点,而不是边。当笔的宽度为1时,边缘为正好画在两个像素之间。
第一种方法是将每个点四舍五入为整数值(snap to A)逻辑像素),并给它笔宽度的一半偏移。这确保线条的边缘与逻辑像素对齐。
幸运的是,milcore (MIL代表媒体)的开发者集成层,也就是wpf渲染引擎)给了我们一个方法引导渲染引擎将逻辑坐标精确地对齐到物理设备像素。要实现这一点,我们需要创建一个GuidelineSet
protected override void OnRender(DrawingContext drawingContext)
{
Pen pen = new Pen(Brushes.Black, 1);
Rect rect = new Rect(20,20, 50, 60);
double halfPenWidth = pen.Thickness / 2;
// Create a guidelines set
GuidelineSet guidelines = new GuidelineSet();
guidelines.GuidelinesX.Add(rect.Left + halfPenWidth);
guidelines.GuidelinesX.Add(rect.Right + halfPenWidth);
guidelines.GuidelinesY.Add(rect.Top + halfPenWidth);
guidelines.GuidelinesY.Add(rect.Bottom + halfPenWidth);
drawingContext.PushGuidelineSet(guidelines);
drawingContext.DrawRectangle(null, pen, rect);
drawingContext.Pop();
}