2009-12-16 31 views
4

WPF的一个大问题是反锯齿。 实际上,这就是为什么UseLayoutRending是在WPF 4.0中引入的。 然而,它并不适合我下面的示例中的工作:如何避免使用WPF进行抗锯齿?

<StackPanel UseLayoutRounding="True" TextOptions.TextFormattingMode="Display" > 
    <Line X1="0" Y1="0" X2="200" Y2="0" StrokeThickness="1" Stroke="Black" SnapsToDevicePixels="True" UseLayoutRounding="True"></Line> 
    <Line X1="0" Y1="1.5" X2="200" Y2="1.5" StrokeThickness="1" Stroke="Black" SnapsToDevicePixels="True" UseLayoutRounding="True"></Line> 
    <Line X1="0" Y1="3.5" X2="200" Y2="3.5" StrokeThickness="1" Stroke="Black" SnapsToDevicePixels="True" UseLayoutRounding="True"></Line> 
    <Line X1="0" Y1="7" X2="200" Y2="7" StrokeThickness="1" Stroke="Black" SnapsToDevicePixels="True" UseLayoutRounding="True"></Line> 
    <Line X1="0" Y1="9" X2="200" Y2="9" StrokeThickness="1" Stroke="Black" SnapsToDevicePixels="True" UseLayoutRounding="True"></Line> 
</StackPanel> 

最后两行仍然是模糊的。 (我正在使用Windows 7)

任何解决方案?

或者它是WPF 4.0测试版中的一个错误?

回答

0

您是否尝试将TextOptions.TextFormattingMode属性更改为Display?详细信息请参见Lester Lobo的this post

+0

试过了,对我没有任何改变。是否适合你? – 2009-12-17 01:39:35

+0

说实话,我没有尝试......我只记得从莱斯特的博客文章;) – 2009-12-17 02:10:32

+0

TextOptions.TextFormattingMode应该只适用于文本,在我的理解。这不应该影响事情。但它在使文本看起来更好时非常有用! – cplotts 2014-12-15 16:49:53

1

原因显然更简单。我只“ 2010年VB临WPF”,而不是虽然MSDN上发现了一个说明在:http://books.google.de/books?id=F-gMZkAlUDUC&pg=PA334&lpg=PA334

总之,StrokeThickness将被划分为一个形状的两侧,所以为1的StrokeThickness等于厚度为0.5为由于线条只有一面,所以它的厚度为0.5单位,因此即使在使用SnapsToDevicePixels=True时也会显得模糊不清。所以简单地使用“2”作为StrokeThickness。

您可以通过使用4的StrokeThickness来验证该行,那么该行的厚度将为2,这比单个像素的“单位”偏差更大。

+0

你最后一句话是不准确的。如果将StrokeThickness设置为4 ......则其笔触厚度应为4 ......或者其笔触厚度应为3,并且在3个实心像素的任一侧上具有半像素。 – cplotts 2014-12-15 16:59:41

+0

@cplotts为什么不准确?测试时你有没有得到其他结果? – floele 2014-12-16 13:00:16

+0

绝对@floele。我会很好奇看到你描述的一些示例代码。 – cplotts 2014-12-16 20:41:24

2

Floele的答案显示了正确的方向,但答案并不完整。只需将y值设置为半个像素,例如Y1 =“7” - > Y1 =“7.5”

这就是第二行和第三行没有模糊的原因。

2

让线条在WPF中看起来很清晰可能非常困难!有时候......它似乎也需要一些黑魔法!

我认为floele和Kimke的答案指向了正确的方向。也就是说,通常情况下,您会希望将单个像素线放在0.5像素的边界上......考虑到它画线的方式(一边是一边而另一边是一半)。

但是,它并不总是那么简单。例如,它也取决于周围的xaml。例如,出于试试这个代码,当你做调整:

<Canvas HorizontalAlignment="Center" VerticalAlignment="Center"> 
    <Line X1="0" Y1="5" X2="200" Y2="5" StrokeThickness="1" Stroke="Black" UseLayoutRounding="True"/> 
    <Line X1="0" Y1="15" X2="200" Y2="15" StrokeThickness="1" Stroke="Black" UseLayoutRounding="True"/> 
</Canvas> 

然后,出去试试这个代码(同样,当你做调整):

<Canvas HorizontalAlignment="Center" VerticalAlignment="Center" UseLayoutRounding="True"> 
    <Line X1="0" Y1="5" X2="200" Y2="5" StrokeThickness="1" Stroke="Black"/> 
    <Line X1="0" Y1="15" X2="200" Y2="15" StrokeThickness="1" Stroke="Black"/> 
</Canvas> 

两个片段之间的唯一区别是第一个在行上使用UseLayoutRounding,第二个在Canvas容器上使用UseLayoutRounding(随后也将属性继承到行)。

然而,这种差异产生了一些有趣的结果。当在容器上使用UseLayoutRounding时,单个像素线始终保持分布在2个像素以上,并且不会四处移动。当直接在线上使用UseLayoutRounding,并调整大小时,线条有时会变为1像素锐利,而其他时间则会变为2像素以上。

这使我想到了原始问题中的示例xaml。几点意见:

  1. 首先,你应该认识到,UseLayoutRounding和SnapsToDevicePixels属性都继承。也就是说,如果您在布局容器上使用它,它将继承到布局容器中的项目。
  2. UseLayoutRounding和SnapsToDevicePixels不一定要一起使用。他们可以...但我通常会尝试单独使用它们......无论是其中一个。此处更多信息:When should I use SnapsToDevicePixels in WPF 4.0?
  3. TextOptions.TextFormattingMode选项会影响文本,而不会影响文本行。
  4. 您正在用作布局容器的StackPanel也可能会影响如何布置线条。帆布可以让你更精确地定位你的线条。 StackPanel只会在另一行后面布局一行......并可能会产生一些意想不到的结果。

更多信息比原来的海报想要的。不过,我个人知道如何在WPF中清晰线条。希望这个信息有助于某人!