2009-12-16 30 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中清晰線條。希望這個信息有助於某人!