Используя Xamarin.FFImageLoading.Svg.Forms Я создал пользовательский класс RecolorableSvg
, который наследуется от SvgCachedImage
с привязываемым свойством NewColor
, которое изменяет цвета в SVG, устанавливая ReplaceStringMap
.К сожалению, это работает, только если я установлю NewColor до инициализации объекта RecolorableSvg.
Установка для NewColor явного цвета (например, XAML: NewColor="Red"
) успешно перекрасит SVG, но установка NewColor с помощью привязки XAML илидаже непосредственно через код, который запускается после создания RecolorableSvg, не вызывает перекрашивание SVG.
Вот метод, который вызывается в RecolorableSvg, когда установлен NewColor:
private static void OnNewColorPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var svg = (RecolorableSvg)bindable;
var newColor = (Color)newValue;
string oldColorText = svg.OriginalColorText;
if ((Color)oldValue != Color.Default)
{
oldColorText = ((Color)oldValue).GetHexString();
}
Console.WriteLine($"'{oldColorText}' --> '{newColor.GetHexString()}'");
svg.ReplaceStringMap = new Dictionary<string, string>
{
{ $"fill=\"{oldColorText}\"", $"fill=\"{newColor.GetHexString()}\"" }
};
}
После установки ReplaceStringMap я попытался добавить svg.ReloadImage();
и svg.OnPropertyChanged(nameof(FFImageLoading.Forms.CachedImage.SourceProperty));
, но единственный способ получить его для изменения цвета - это явно установить svg.Source
в строку URI.