Xamarin Xam.Plugins.Forms.Svg 更改 SvgPath 以重新渲染图像
Xamarin Xam.Plugins.Forms.Svg change SvgPath to rerender the image
我用Xam.Plugins.Forms.Svg支持svg图片。我需要更改图像,所以我尝试了:
绑定在xaml:
<abstractions:SvgImage
SvgPath="{Binding CurrentWeather.IconSource, StringFormat='Umbrella.Images.{0:F0}.svg'}"
....
/>
直接从 C# 更改它:
icon.SvgPath = "Umbrella.Images." + currentWeather.IconSource + ".svg";
SvgPath 属性确实发生了变化,但图像没有重新呈现。
有什么解决办法吗?
渲染器的编写方式存在 问题,您需要创建一个 new SvgImage
对象并按照渲染器的工作方式替换页面中的当前打开,以便从新的 SVG 文件更新静态 Image
。
您可以通过覆盖 OnElementPropertyChanged
事件并响应 SvgPath
PropertyName 更改来修补渲染器:
iOS 示例:
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == "SvgPath")
{
var svgStream = _formsControl.SvgAssembly.GetManifestResourceStream(_formsControl.SvgPath);
var reader = new SvgReader(new StreamReader(svgStream), new StylesParser(new ValuesParser()), new ValuesParser());
var graphics = reader.Graphic;
var canvas = new ApplePlatform().CreateImageCanvas(graphics.Size);
graphics.Draw(canvas);
var image = canvas.GetImage();
var uiImage = image.GetUIImage();
Control.Image = uiImage;
}
}
我用Xam.Plugins.Forms.Svg支持svg图片。我需要更改图像,所以我尝试了:
绑定在xaml:
<abstractions:SvgImage
SvgPath="{Binding CurrentWeather.IconSource, StringFormat='Umbrella.Images.{0:F0}.svg'}"
....
/>
直接从 C# 更改它:
icon.SvgPath = "Umbrella.Images." + currentWeather.IconSource + ".svg";
SvgPath 属性确实发生了变化,但图像没有重新呈现。
有什么解决办法吗?
渲染器的编写方式存在 问题,您需要创建一个 new SvgImage
对象并按照渲染器的工作方式替换页面中的当前打开,以便从新的 SVG 文件更新静态 Image
。
您可以通过覆盖 OnElementPropertyChanged
事件并响应 SvgPath
PropertyName 更改来修补渲染器:
iOS 示例:
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == "SvgPath")
{
var svgStream = _formsControl.SvgAssembly.GetManifestResourceStream(_formsControl.SvgPath);
var reader = new SvgReader(new StreamReader(svgStream), new StylesParser(new ValuesParser()), new ValuesParser());
var graphics = reader.Graphic;
var canvas = new ApplePlatform().CreateImageCanvas(graphics.Size);
graphics.Draw(canvas);
var image = canvas.GetImage();
var uiImage = image.GetUIImage();
Control.Image = uiImage;
}
}