【发布时间】:2013-03-15 14:18:38
【问题描述】:
我正在尝试创建某种带有发光背景的标签。为此,我决定在内容控件上使用样式。发光效果来自两个DropShadowEffects,我希望绑定到内容控件的Foreground Property。 Foreground Property 是 Brush 类型,DropShadowEffect.Color 是 Color 类型,所以我需要在这两者之间进行转换。
每当我尝试通过转换器设置发光颜色时,发光效果都会保持黑色。似乎转换器代码甚至从未通过。我确实在转换器中返回了预定义的颜色(无转换),甚至添加了 Debug.Break(),但无济于事。
你能告诉我我做错了什么吗,或者是否有其他更好的方法来实现带有发光背景的标签。
转换器:
public class ColorToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) return null;
if (value is Color)
{
Color color = (Color)value;
BrushConverter bc = new BrushConverter();
return bc.ConvertFrom(color);
}
Type type = value.GetType();
throw new InvalidOperationException("Unsupported type ["+type.Name+"]");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (value is Brush)
{
Brush brush = (Brush)value;
BrushConverter bc = new BrushConverter();
return bc.ConvertTo(brush, typeof(Color));
}
Type type = value.GetType();
throw new InvalidOperationException("Unsupported type ["+type.Name+"]");
}
}
在资源字典中:
<local:ColorToBrushConverter x:Key="Color2BrushConverter" />
<Style x:Key="ContentControlGlowStyle" TargetType="{x:Type ContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContentControl}">
<Border>
<Border.Effect>
<DropShadowEffect
BlurRadius="15"
Color="{Binding Path=Foreground, Converter={StaticResource Color2BrushConverter}}"
ShadowDepth="2"
Direction="0"/>
</Border.Effect>
<TextBlock Name="Highlight" Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding Content}" Margin="10,5,0,0">
<TextBlock.Effect>
<DropShadowEffect
BlurRadius="15"
Color="{Binding Path=Foreground,Converter={StaticResource Color2BrushConverter}}"
ShadowDepth="2"
Direction="0"/>
</TextBlock.Effect>
</TextBlock>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在 XAML 中:
<ContentControl Name="cc2" Style="{DynamicResource ContentControlGlowStyle}"
FontSize="24"
Foreground="LightBlue"
Background="LightBlue"
Content="some content to display"
FontFamily="Verdana" />
【问题讨论】:
-
你应该看看输出窗口,看看它是否显示任何异常。这可以让您更深入地了解正在发生的事情。
-
VS 不会抱怨输出窗口中的绑定。
-
唯一想到的另一件事是设置颜色绑定的相对来源。
-
@TYY:将RelativeSource 设置为
{RelativeSource AncestorType={x:Type ContentControl}}成功了。有一些小的额外问题,但这些是不同的主题,我可以处理。请写一个答案,以便我标记它。谢谢。 -
没问题很高兴我能帮上忙。我在某个时间点遇到过类似的问题,我记得它与设置相对源有关。
标签: c# wpf data-binding ivalueconverter