我有一个渐变色,它会不断变化;我希望里面的文字始终可见。
如果有现成的资源,我更愿意动态地完成这个效果;我想要一个“魔法刷”,来抵消颜色。
有没有什么实验?
(luminance + 50%) mod 100%
。然而,在大多数情况下,这种算法并不产生美观的结果,并且它的亮度变化永远不超过50%。修改这个算法的方法是反转或移动色调和饱和度值。luminance>50% ? 0% : 100%
。这也可能存在美学问题。颜色反转可能可以作为位图效果完成,但还有一种更简单的方法。
创建一个Grid
,将其作为三个子面板的容器,以便这些子面板完全重叠:
在具有透明背景(默认情况下)的面板中放置文本。将此面板命名为“mask”。
创建另一个名为“mainbackground”的面板,并将其设置为主渐变背景。将其放置在“mask”面板后,以覆盖文本。
创建另一个名为“invertedforeground”的面板,并给它相反的渐变。对于主渐变中的每个颜色值,都将其赋予相反的值(例如,如果一个颜色是#FF0000
,则将其设置为#00FFFF
)。您可以像第一个渐变一样动画此渐变,只需使用相反的值即可。然后,将此面板的OpacityMask
设置为VisualBrush
,并将VisualBrushes
的Visual
属性设置为{Binding ElementName=mask}
。
<Grid>
<Grid.Resources>
<local:MyColorConverter x:Key="colorConverter" />
</Grid.Resources>
<Grid
Name="mask">
<TextBlock
Name="mytext"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="32"
Foreground="White"
FontWeight="Bold">Blah blah blah</TextBlock>
</Grid>
<Grid Name="mainbackground">
<Grid.Background>
<LinearGradientBrush
ColorInterpolationMode="ScRgbLinearInterpolation"
EndPoint="1,0">
<GradientStop x:Name="stop1"
Color="#FF0000"
Offset="0" />
<GradientStop x:Name="stop2"
Color="#00FF00"
Offset="0.5" />
<GradientStop x:Name="stop3"
Color="#0000FF"
Offset="1" />
</LinearGradientBrush>
</Grid.Background>
</Grid>
<Grid Name="invertedforeground">
<Grid.Background>
<LinearGradientBrush
ColorInterpolationMode="ScRgbLinearInterpolation"
EndPoint="1,0">
<GradientStop
Color="{Binding ElementName=stop1, Path=Color, Converter={StaticResource colorConverter}}"
Offset="0" />
<GradientStop
Color="{Binding ElementName=stop2, Path=Color, Converter={StaticResource colorConverter}}"
Offset="0.5" />
<GradientStop
Color="{Binding ElementName=stop3, Path=Color, Converter={StaticResource colorConverter}}"
Offset="1" />
</LinearGradientBrush>
</Grid.Background>
<Grid.OpacityMask>
<VisualBrush
Visual="{Binding ElementName=mask}" />
</Grid.OpacityMask>
</Grid>
</Grid>
TextBlock
的坐标上,因此我回到了将文本用作OpacityMask
的先前解决方案。
IValueConverter
的示例用法,并将文本渐变色绑定到原始渐变色。您还可以在更高的地方使用绑定和转换器,例如将invertedforeground
的Background
属性绑定到mainbackground
的Background
属性,转换器接收输入的渐变笔刷并返回不同的渐变笔刷(这允许您创建具有与原始渐变非常不同的配置的渐变)。