似乎 DropShadowEffect 在渲染时会影响颜色。对于基本颜色(如红色、蓝色、青色等 Colors,但您也可以通过 #AARRGGBB 格式指定它们),这个问题似乎不存在。
我无法确定它所做的确切修改,也不能提供解决方法(除了使用命名颜色……),但我想也许在答案中提一下这个问题可能是值得的。
请参阅其他问题,这些问题可能指向 DropShadowEffect 的同一“错误”或未记录的特性:
- DropShadowEffect with DynamicResource as color has weak visibility
- WPF DropShadowEffect - Unexpected Color Difference
更新:
因此,这是作弊,但对于您的具体问题,它可能会解决问题:
<Grid>
<Canvas>
<Ellipse Width="200" Height="300" Fill="#7D00FE">
<Ellipse.Effect>
<DropShadowEffect
ShadowDepth="5"
Color="#BA00FE"/>
</Ellipse.Effect>
</Ellipse>
</Canvas>
</Grid>
通过一些投入的工作,可能会有一个转换器,可以将一种颜色转换为另一种颜色,这将是所需的给定颜色的DropShadowEffect颜色。如果我有一点时间,我会回来处理这个问题。
我的直觉表明,该特定效果的着色器代码可能存在问题,并且输出可能因不同的硬件(和/或驱动程序版本)而异,但目前我无法证明这一点。
更新:
我错了关于命名颜色,它并不适用于所有这些,例如:绿色有缺陷,但问题并不仅仅取决于颜色的绿色成分。有趣。
更新2:
所以这里是我之前谈到的转换器:
using System;
using System.Windows.Data;
using System.Windows.Media;
namespace MyCustomConverters
{
public class ColorToShadowColorConverter: IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is SolidColorBrush)
{
Color color = ((SolidColorBrush)value).Color;
var r = Transform(color.R);
var g = Transform(color.G);
var b = Transform(color.B);
return Color.FromArgb(color.A, r, g, b);
}
return value;
}
private byte Transform(byte source)
{
return (byte)(Math.Pow(source / 255d, 1 / 2.2d) * 255);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException("ColorToShadowColorConverter is a OneWay converter.");
}
#endregion
}
}
以下是使用方法:
资源部分:
<namespaceDefinedByXmlnsProperty:ColorToShadowColorConverter x:Key="ColorConverter" />
真实用法:
<Ellipse Width="50" Height="100" Fill="#7D00FE">
<Ellipse.Effect>
<DropShadowEffect ShadowDepth="50"
Color="{Binding Fill, RelativeSource={RelativeSource
Mode=FindAncestor, AncestorType={x:Type Ellipse}},
Converter={StaticResource ColorConverter}}"/>
</Ellipse.Effect>
</Ellipse>
感谢Michal Ciechan的答案,它指引了我正确的方向。