dotnet 9 WPF 支持 Style 的 Setter 填充内容时可忽略 Value 标签
更新: 由于此功能导致 BAML 内容变化,由高版本 SDK 构建将在低版本 Runtime 运行不起来。直接报错信息是 System.Windows.Markup.XamlParseException 异常,内部是 IndexOutOfRangeException: Index was outside the bounds of the array 异常。于是最终决定撤回更改
在原先的 WPF 版本里面,对 Style 的 Setter 填充复杂的对象内容时,大概的示例代码如下
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
...
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
可以看到 <Setter.Value>
属于不可省略的内容
在本次引入的改进之后,即可将 Setter 的 Value 当成默认内容,从而减少 <Setter.Value>
的代码,改进后的写法如下
<Style TargetType="Button">
<Setter Property="Template">
<ControlTemplate TargetType="Button">
...
</ControlTemplate>
</Setter>
</Style>
此改进是在许多年前,由 Thomas Levesque 大佬在 https://github.com/dotnet/wpf/issues/84 提出的。被微软的 Anjali 在 https://github.com/dotnet/wpf/pull/8534 实现
此变更将影响 XAML 语法,对应的文档也进行了同步更新,详细请看 https://github.com/dotnet/dotnet-api-docs/pull/9581
为什么之前的版本里面,必须编写 <Setter.Value>
呢?这是因为在原先的版本里面 Style 的 Setter 的 Value 不是默认的内容,即在 Setter 标签里面直接放入内容,将不能被放入到 Value 属性里面
在 https://github.com/dotnet/wpf/pull/8534 的实现里面,将 Setter 的 Value 当成默认内容,于是在 Setter 里面放入的内容,将会自动给 Value 进行赋值
上述的核心逻辑在 src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Markup/Baml2006/WpfGeneratedKnownTypes.cs 里面,给创建 Setter 时,配置 baml 类型里面内容对应的属性名是 "Value" 属性名,如以下代码
private WpfKnownType Create_BamlType_Setter(bool isBamlType, bool useV3Rules)
{
var bamlType = new WpfKnownType(this, // SchemaContext
556, "Setter",
typeof(System.Windows.Setter),
isBamlType, useV3Rules);
bamlType.DefaultConstructor = delegate() { return new System.Windows.Setter(); };
bamlType.ContentPropertyName = "Value"; // 这是本次更改的核心逻辑
bamlType.Freeze();
return bamlType;
}
当前的 WPF 在 https://github.com/dotnet/wpf 完全开源,使用友好的 MIT 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。在仓库里面包含了完全的构建逻辑,只需要本地的网络足够好(因为需要下载一堆构建工具),即可进行本地构建
博客园博客只做备份,博客发布就不再更新,如果想看最新博客,请访问 https://blog.lindexi.com/
如图片看不见,请在浏览器开启不安全http内容兼容

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含链接:https://www.cnblogs.com/lindexi ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我[联系](mailto:lindexi_gd@163.com)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
2022-05-09 dotnet 6 在 Win7 系统证书链错误导致 HttpWebRequest 内存泄露
2020-05-09 Windows 窗口样式 什么是 WS_EX_NOREDIRECTIONBITMAP 样式
2020-05-09 Windows 对全屏应用的优化
2020-05-09 GitHub Action 新上线 WPF .NET Core 自动构建模板
2018-05-09 win10 uwp 商业游戏 1.2.1
2018-05-09 win10 uwp 商业游戏 1.2.1
2017-05-09 生成密码