4

WPF 的一大问题是抗锯齿。事实上,这就是WPF 4.0 中引入UseLayoutRending的原因。但是,它在以下示例中对我不起作用:

<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 测试版中的一个错误?

4

4 回答 4

2

弗洛尔的回答表明了正确的方向,但答案并不完整。只需将 y 值设置为半个像素,例如 Y1="7" -> Y1="7.5"

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

于 2013-03-15T13:20:52.110 回答
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>

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

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

这让我想到了原始问题中的示例 xaml。对它的几点评论:

  1. 首先,您应该意识到 UseLayoutRounding 和 SnapsToDevicePixels 属性都继承。也就是说,如果您在布局容器上使用它,它将继承到布局容器中的项目。
  2. UseLayoutRounding 和 SnapsToDevicePixels 不一定要一起使用。它们可以是……但我通常会尝试单独使用它们……其中一种。更多信息:我什么时候应该在 WPF 4.0 中使用 SnapsToDevicePixels?
  3. TextOptions.TextFormattingMode 选项影响文本,而不是行。
  4. 您用作布局容器的 StackPanel 也可能影响线条的布局方式。Canvas 允许您更精确地控制线条的定位。StackPanel 只会在另一行之后布局一行......并且可能会产生一些意想不到的结果。

比原始海报想要的更多信息。但是,我个人知道在 WPF 中使线条清晰是多么棘手。希望此信息对某人有所帮助!

于 2014-12-15T18:07:56.077 回答
1

原因显然更简单。我只在“VB 2010 中的 Pro WPF”中找到了解释,但在 MSDN 上没有找到:http: //books.google.de/books ?id=F-gMZkAlUDUC&pg=PA334&lpg=PA334

简而言之,StrokeThickness将分割一个形状的两侧,因此aStrokeThickness为1等于每侧的厚度为0.5,并且由于线条只有一侧,因此它将是0.5个单位的粗细,因此即使在使用时也会显得模糊SnapsToDevicePixels=True。所以只需使用“2”作为 StrokeThickness。

您可以通过使用StrokeThickness4 来验证这一点,那么线条的粗细将为 2,这不仅仅是“意外”的单个像素偏差。

于 2012-01-02T10:46:17.740 回答
0

您是否尝试将TextOptions.TextFormattingMode属性更改为Display?有关详细信息,请参阅Lester Lobo 的这篇文章

于 2009-12-17T01:34:07.173 回答