使用的MarkupExtension显示在XAML图像

问题描述 投票:2回答:1

我有一个资源(的.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>

这不会给任何错误,只是什么也不做。所以我的问题是

  1. 我怎样才能重新分配图像来获得另一种颜色的来源
  2. 是否有使用类似的结合改变从VM的颜色的方法
  3. 有没有办法缩短{x:Static img:SvgResources.TheIcon喜欢的东西svgResource.TheIcon

编辑

我发现,该触发器不会更改源,如果我不设置控件本身的来源,而是提供触发(IsMouseOver = FALSE)默认值。问题2 + 3仍然

wpf xaml resources markup
1个回答
0
投票

回答问题2。

您可以扩展您的MarkupExtension支持BindingMultiValueConverter

创建简单MultiValueConverter,这就叫你ImageResource.CreateFromSvg(...);。传递给该转换器的值将图像和Brush(静态图像或刷子从绑定解决)

ProvideValue(...)检测传递价值BrushBinding。如果是Brush为它创建模拟BindingBrushSource。如果值是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}}"/>
© www.soinside.com 2019 - 2024. All rights reserved.