如何在WPF边框上创建斜角?

时间:2011-04-11 19:45:17

标签: wpf drawing rendering snapstodevicepixels

我正在尝试在装饰器的子类中进行简单绘制,类似于他们在这里所做的...

How can I draw a border with squared corners in wpf?

...除了单像素边框厚度,而不是他们在那里使用的两个。然而,无论我做什么,WPF都决定它需要进行“平滑”(例如,不是渲染单像素线,而是渲染两个像素的线,每个'一半'约为不透明度的50%。)换句话说,它试图对绘图进行反锯齿。我不想想要消除锯齿的绘图。我想说如果我画一条从0,0到10,0的线,我得到的是一条像素宽的线,正好是10像素长而没有平滑。

现在我知道WPF就是这么做的,但我认为这就是他们引入SnapsToDevicePixels和UseLayoutRounding的原因,我在XAML中都设置了'True'。我也确保我使用的数字是实际整数而不是分数,但我仍然没有得到我希望的漂亮,清晰,一像素宽的线。

帮助!!!

标记

2 个答案:

答案 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();
}