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

.NET 9中使用XamlWriter与XamlReader序列化Style抛异常的解决方法

解决.NET 9中Style序列化/反序列化异常的方案

问题根源

.NET 9的XamlWriter在序列化Setter时,会省略<Setter.Value>标签(针对值类型或可直接文本化的属性值),但XamlReader反序列化时要求必须显式包含该标签,导致兼容性异常。

可行解决方案

方案1:手动修复序列化后的XAML内容

在保存XAML到文件前,对生成的内容做替换,自动补全缺失的<Setter.Value>标签:

string xamlOutput = stringWriter.ToString();
// 正则匹配缺少Value包裹的Setter标签,补全结构
xamlOutput = Regex.Replace(xamlOutput, 
    @"<Setter Property=""([^""]+)"" Value=""([^""]+)"" />", 
    @"<Setter Property=""$1""><Setter.Value>$2</Setter.Value></Setter>");
File.WriteAllText(filePath, xamlOutput);

注意:该正则仅适配简单值类型的Setter,若Setter包含绑定、资源引用等复杂对象,需要调整正则逻辑。

方案2:使用自定义XAML序列化器替代XamlWriter

自定义序列化逻辑,确保所有Setter都显式生成<Setter.Value>标签:

public static string SerializeStyle(Style style)
{
    var sb = new StringBuilder();
    sb.AppendLine("<Style xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" TargetType=\"" + style.TargetType.Name + "\">");
    
    foreach (Setter setter in style.Setters)
    {
        sb.Append($"  <Setter Property=\"{setter.Property.Name}\">");
        sb.Append("<Setter.Value>");
        
        // 根据属性值类型处理序列化逻辑
        if (setter.Value is Enum enumValue)
        {
            sb.Append(enumValue.ToString());
        }
        else if (setter.Value is SolidColorBrush solidBrush)
        {
            sb.Append($"#{solidBrush.Color.R:X2}{solidBrush.Color.G:X2}{solidBrush.Color.B:X2}");
        }
        else
        {
            sb.Append(XamlWriter.Save(setter.Value));
        }
        
        sb.Append("</Setter.Value></Setter>");
        sb.AppendLine();
    }
    
    sb.AppendLine("</Style>");
    return sb.ToString();
}

使用时替换原XamlWriter.Save调用:

string xamlOutput = SerializeStyle(style);
File.WriteAllText(filePath, xamlOutput);

方案3:等待官方修复

该问题属于.NET 9的兼容性回归,可关注官方仓库的Issue跟踪,等待发布补丁或更新版本修复此问题。


内容的提问来源于stack exchange,提问作者Karkuvel Rajan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:34:56