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" />
<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>
<TranslateTransform X="0.5" Y="0.5"/>
</Line.RenderTransform>
但是这个也不是一劳永逸的,实际运用中发现当把线条的厚度设成2个像素时却变得模糊了。
暂时只能在后台代码中这么做了:
line.RenderTransform = StrokeThickness % 2 == 0 ? null : new TranslateTransform() { X = 0.5, Y = 0.5 };
好了,问题都解决了,虽然感觉上不是那么完美。
半路和尚 by 超时空饭盒 is licensed under a Creative Commons 署名-非商业性使用-相同方式共享 3.0 Unported License.
基于halfwaymonk.cnblogs.com上的作品创作。