silverlight-Canvas中1像素的线变成了2像素

之前自己写了个控件,中间有关于线形样式的设置,包括线宽。一开始就发现1像素的线条会变的有点模糊,颜色变淡。当时也没太在意。

后来老板发现了这个问题,有的线1像素就是1像素,而有点线1像素实际上显示成了2个像素,问我怎么回事。我说都是设置StrokeThickness=1,这个问题没办法解决。后来还是老板在网上找了部分答案。想想自己真的是不应该,反思。

实验发现Rectangle在Canvas中会出现这种情况,在Grid中就不会。都是Canvas半个像素惹得祸。

解决办法如下:

1.Silverlight anti-aliasing woes

通过Math.Round进行设置 

Canvas.SetTop(element, Math.Round(top));

而对于Line这一招似乎并不有效:

2.Silverlight Rectangles, Paths, and Line Comparison

给线条的起始坐标加上半个像素的偏移

<Line Stroke="Black" StrokeThickness="1" X1="80" Y1="70" X2="80" Y2="20" />

<Line Stroke="Blue" StrokeThickness="1" X1="90.5" Y1="95.5" X2="90.5" Y2="45.5" />

这个或许有点麻烦,那么更简单的就是:

3.1px line issue in silverlight

直接设置Line的RenderTransform

<Line.RenderTransform>
<TranslateTransform X="0.5" Y="0.5"/>
</Line.RenderTransform>

但是这个也不是一劳永逸的,实际运用中发现当把线条的厚度设成2个像素时却变得模糊了。

暂时只能在后台代码中这么做了:

line.RenderTransform = StrokeThickness % 2 == 0 ? null : new TranslateTransform() { X = 0.5, Y = 0.5 };

好了,问题都解决了,虽然感觉上不是那么完美。

posted @ 2010-12-13 16:10  超时空饭盒  阅读(1058)  评论(0编辑  收藏  举报