You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 05:21:03