我通过在覆盖上应用不透明掩码将禁用的ImageButton自定义控件上的图像变灰。预期的效果是,只有图像的主体是灰色的,所以没有边框或框放置在图像上。
问题是:只要通过绑定getter(在{TemplateBinding XXX}中编写的东西)访问图像URI,掩码将不适用。但是,如果显式地声明了URI,则掩码将起作用。所以问题是,为什么在TmplateBinding的情况下会出现这个问题,以及如何解决它。
定义自定义图像按钮的XAML代码是: <my1:ImageButton Height="24" Width="24" x:Name="imageButton1" IsEnabled="False" ImageSource="/SilverlightApplication4;component/Undo_24x24.png" Margin="178,75,198,201">
<Image Source="/SilverlightApplication4;component/Undo_24x24.png" Height="24" Width="24" />
</my1:ImageButton>
自定义属性处理程序代码为:
public class ImageButton: Button
{
public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(ImageButton), new PropertyMetadata(null));
public ImageSource ImageSource
{
get
{
return (ImageSource)this.GetValue(ImageSourceProperty);
}
set
{
this.SetValue(ImageSourceProperty, value);
}
}
}
自定义控件的样式代码(禁用状态):
<Rectangle x:Name="DisabledVisualElement" Fill="Red" Opacity="0" >
<Rectangle.OpacityMask>
<ImageBrush ImageSource="{TemplateBinding ImageSource}"/>
</Rectangle.OpacityMask>
</Rectangle>
有趣的是,下面的代码片段都放置在样式模板
中<Image Source="{TemplateBinding ImageSource}" Height="24" Width="24" />
和
<Rectangle x:Name="DisabledVisualElement" Fill="Red" Opacity="0" >
<Rectangle.OpacityMask>
<ImageBrush ImageSource="/SilverlightApplication4;component/Undo_24x24.png"/>
</Rectangle.OpacityMask>
</Rectangle>
都能正常工作。因此,问题似乎在于ImageSource="{TemplateBinding ImageSource}"不知何故不能检索正确的URI或由于其他原因不起作用。那么,如何纠正这一点呢?
TemplateBinding不像常规绑定那样功能齐全。TemplateBinding不能自动将字符串/uri转换为实际的位图。
解决方案(使用常规绑定):
<Rectangle x:Name="DisabledVisualElement" Fill="Red" Opacity="0" >
<Rectangle.OpacityMask>
<ImageBrush ImageSource="{Binding Path=ImageSource, RelativeSource={RelativeSource TemplatedParent}}"/>
</Rectangle.OpacityMask>
</Rectangle>