我在WPF中遇到了像素着色器的奇怪行为.
这个问题100%可重复,所以我写了一个小的演示程序.您可以在此处下载源代码.
万恶之源是名为MyFrameworkElement的小类:
internal sealed class MyFrameworkElement : FrameworkElement
{
public double EndX
{
get
{
return (double)this.GetValue(MyFrameworkElement.EndXProperty);
}
set
{
this.SetValue(MyFrameworkElement.EndXProperty, value);
}
}
public static readonly DependencyProperty EndXProperty =
DependencyProperty.Register("EndX",
typeof(double),
typeof(MyFrameworkElement),
new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.AffectsRender));
protected override void OnRender(DrawingContext dc)
{
dc.DrawLine(new Pen(Brushes.Red, 2), new Point(0, 0), new Point(this.EndX, 100));
dc.DrawLine(new Pen(Brushes.Green, 3), new Point(10, 300), new Point(200, 10));
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,此框架元素呈现2行:下面的行具有永久坐标,但上面的行依赖于EndX依赖项属性.
所以这个框架元素是像素着色器效果的目标.为简单起见,我使用此处的灰度着色器效果.所以我将GrayscaleEffect应用于MyFrameworkElement.你可以看到结果,看起来不错.
直到我大幅增加EndX属性.

小线模糊,大线很好!
但是如果我删除灰度效果,所有线条都会看起来应该如此.

任何人都可以解释这种模糊的原因是什么?或者甚至更好我如何解决这个问题?