Xamarin中修改SVG内部path路径颜色不生效问题求助
问题原因
- 未将修改后的SVG内容传递给渲染控件:你修改的只是内存中加载的XmlDocument对象,原
SvgPath绑定的仍是程序集中未修改的原始嵌入SVG资源,SvgImage控件始终读取的是原始文件内容,自然不会生效。 - 嵌入资源流为只读属性:即使你取消注释
xml.Save(stream)也无法修改原始嵌入资源,嵌入资源是编译时固化到程序集内的内容,运行时无法直接改写。 - Style修改逻辑存在缺陷:直接覆盖整个style属性值会丢失原style内的其他配置(比如你原始SVG里的
stroke:#000000),如果你的路径依赖描边显示,覆盖后会导致路径不可见。
解决方法
首先修改XAML部分,给SvgImage添加名称,方便后台直接赋值:
<abstractions:SvgImage x:Name="MySvgImage" Grid.Row="0" Grid.Column="0"/>
然后修改后台Plan.xaml.cs代码,修改完XML后将内容写入内存流,再赋值给SvgImage控件:
public partial class Plan : ContentPage { public Plan() { InitializeComponent(); var svgAssembly = typeof(App).GetTypeInfo().Assembly; string svgPath = "Test.Images.Plan.svg"; // 加载原始SVG嵌入资源 using Stream originalStream = svgAssembly.GetManifestResourceStream(svgPath); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(originalStream); var pathNodes = xmlDoc.GetElementsByTagName("path"); foreach (XmlNode pathNode in pathNodes) { // 只修改特定ID的路径可开启此判断:if(pathNode.Attributes["id"]?.Value == "cp1589") var styleAttr = pathNode.Attributes["style"]; if (styleAttr != null) { // 拆分style属性,只修改fill值,保留其他配置 var styleItems = styleAttr.Value.Split(';', StringSplitOptions.RemoveEmptyEntries) .Select(s => s.Split(':', StringSplitOptions.RemoveEmptyEntries)) .ToDictionary(s => s[0].Trim(), s => s[1].Trim()); styleItems["fill"] = "rgb(0, 128, 0)"; styleAttr.Value = string.Join(";", styleItems.Select(kv => $"{kv.Key}:{kv.Value}")); } // 如果path的fill是单独属性而非写在style里,可直接改: // var fillAttr = pathNode.Attributes["fill"]; // if(fillAttr != null) fillAttr.Value = "rgb(0,128,0)"; } // 将修改后的XML写入内存流 MemoryStream modifiedStream = new MemoryStream(); xmlDoc.Save(modifiedStream); // 重置流位置到开头,否则读取不到内容 modifiedStream.Position = 0; // 给SvgImage控件赋值修改后的流作为源 MySvgImage.Source = SvgImageSource.FromStream(() => modifiedStream); } }
如果使用的Svg库不支持直接从流加载,可将修改后的SVG内容写入应用沙盒内的临时文件,再将临时文件路径赋值给SvgImage的Source即可。
内容的提问来源于stack exchange,提问作者DevQc
相关产品推荐
相关产品推荐

