我正在尝试在装饰器的子类中进行简单绘制,类似于他们在这里所做的...
How can I draw a border with squared corners in wpf?
...除了单像素边框厚度,而不是他们在那里使用的两个。然而,无论我做什么,WPF都决定它需要进行“平滑”(例如,不是渲染单像素线,而是渲染两个像素的线,每个'一半'约为不透明度的50%。)换句话说,它试图对绘图进行反锯齿。我不想想要消除锯齿的绘图。我想说如果我画一条从0,0到10,0的线,我得到的是一条像素宽的线,正好是10像素长而没有平滑。
现在我知道WPF就是这么做的,但我认为这就是他们引入SnapsToDevicePixels和UseLayoutRounding的原因,我在XAML中都设置了'True'。我也确保我使用的数字是实际整数而不是分数,但我仍然没有得到我希望的漂亮,清晰,一像素宽的线。
帮助!!!
标记
答案 0 :(得分:2)
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 :(得分:1)
看一下这篇文章:Draw lines exactly on physical device pixels
<强> UPD 强>
链接中的一些有价值的引用:
线条看起来模糊的原因是我们的点是中心 线的点不是边缘。笔宽为1时,边缘为 在两个像素之间精确绘制。
第一种方法是将每个点舍入为整数值(对齐a 逻辑像素)a给它一个笔宽的一半的偏移量。这个 确保线的边缘与逻辑像素对齐。
幸运的是milcore的开发者(MIL代表媒体 集成层,即WPF渲染引擎)为我们提供了一种方法 引导渲染引擎在a上激动地对齐逻辑坐标 物理设备像素。为实现这一目标,我们需要创建一个 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();
}