我有一个资源(的.resx)与日志它SVG图像。此外,我使用的是可以提供由资源字节[],并将其转换成的ImageSource对象的ImageResource类。虽然这样做,我不得不改变图标的颜色可能性
ImageResource.CreateFromSvg(image, Brushes.Green);
我正在寻找一种简单的方式来获得这些图像为XAML,所以我创建创建使用ImageResource类的图像的另一静态类。在XAML我可以使用
<Image Source={x:Static img:ImageResources.MyGreenIcon}/>
得到的图标。不利的一面是,我是不是可以选择在XAML的颜色。于是,我就创造了的MarkupExtension为。它需要一个字节[]和一个刷作为参数,调用CreateFromSvg-方法并返回图片。在XAML它看起来像这样
<Image Source={i:Img {x:Static img:SvgResources.TheIcon}, Green}/>
凡SvgResources是的.resx文件图像是,虽然这工作得很好,我是不是能够在运行时改变颜色。由于的MarkupExtension是不是一个DependencyProperty我不能使用该颜色的结合。我试图用一个触发器
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Source" Value="{i:Img {x:Static img:SvgResources.TheIcon}, Blue}" />
</Trigger>
</Style.Triggers>
</Style>
这不会给任何错误,只是什么也不做。所以我的问题是
{x:Static img:SvgResources.TheIcon
喜欢的东西svgResource.TheIcon
编辑
我发现,该触发器不会更改源,如果我不设置控件本身的来源,而是提供触发(IsMouseOver = FALSE)默认值。问题2 + 3仍然
回答问题2。
您可以扩展您的MarkupExtension
支持Binding
与MultiValueConverter
。
创建简单MultiValueConverter,这就叫你ImageResource.CreateFromSvg(...);
。传递给该转换器的值将图像和Brush
(静态图像或刷子从绑定解决)
在ProvideValue(...)
检测传递价值Brush
或Binding
。如果是Brush
为它创建模拟Binding
本Brush
为Source
。如果值是Binding
- 我们将使用它。做相同的图像
创建Multibinding
,分配刚刚创建MultiValueConverter
和添加图片和刷绑定。
return
提供的值。
图的MarkupExtension的完整示例:
public class Img : MarkupExtension
{
private readonly object _image;
private readonly object _brush;
public Img(object image, object brush)
{
_image = image;
_brush = brush;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var imageBinding = _image is Binding iBinding ? iBinding : new Binding { Source = _image};
var brushBinding = _brush is Binding bBinding ? bBinding : new Binding { Source = _brush };
var binding = new MultiBinding
{
Converter = new ImgValueConverter()
};
binding.Bindings.Add(imageBinding);
binding.Bindings.Add(brushBinding);
return binding.ProvideValue(serviceProvider);
}
private class ImgValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var image = values[0];
var brush = values[1];
return ImageResource.CreateFromSvg(image, brush);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
用法示例:
<Image Source="{i:Img {x:Static i:SvgResources.TheIcon}, {x:Static Brushes.Yellow}}"/>
<Image Source="{i:Img {x:Static i:SvgResources.TheIcon}, {Binding Brush}}"/>