首页 > 其他分享 >dotnet 9 WPF 支持 Style 的 Setter 填充内容时可忽略 Value 标签

dotnet 9 WPF 支持 Style 的 Setter 填充内容时可忽略 Value 标签

时间:2024-05-09 09:04:47浏览次数:26  
标签:Style bamlType Value dotnet com Setter

本文记录 WPF 在 dotnet 9 的一项 XAML 编写语法改进点,此改进点用于解决编写 Style 的 Setter 进行给 Value 赋值时,不能将 Value 当成默认内容,需要多写 Value 标签的问题。通过此改进点可减少两行 XAML 代码

在原先的 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 提出的。被微软的 Anjalihttps://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 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。在仓库里面包含了完全的构建逻辑,只需要本地的网络足够好(因为需要下载一堆构建工具),即可进行本地构建

标签:Style,bamlType,Value,dotnet,com,Setter
From: https://www.cnblogs.com/lindexi/p/18181294

相关文章

  • 解决Vue3项目警告:xxxis-declared-but-its-value-is-never-read
    刚刚在Vue3项目引入的一个组件Person下有红线,系统给出了警告,这是因为TypeScript会检查代码中未使用的变量,我定义了'Person'的变量,但是后续代码没有使用到它,从而导致Vetur(Vue的语法检查工具)给出了这个警告。解决方法:方法一:你可以删除或者在代码中使用'Person'变量或类型,以......
  • [20240426]sql_id 转换hash_value.txt
    [20240426]sql_id转换hash_value.txt--//以前写的脚本,转换sql_idtohash_value.遇到问题:$cats2p.sh#!/bin/bash#convertsql_idtohash_valueodebug=${ODEBUG:-0}sql_id="$*"v1=$(echo$sql_id|tr$(echo{0..9}{a..z}|tr-d'eilo')$(echo{0..9}{a.......
  • c# Dictionary<TKey,TValue>.TryAdd
    原文链接:https://learn.microsoft.com/zh-cn/dotnet/fundamentals/code-analysis/quality-rules/ca1864Dictionary<TKey,TValue>.ContainsKey(TKey) 和 Dictionary<TKey,TValue>.Add 都执行查找操作,这是冗余设置。如果字典中已存在键,Dictionary<TKey,TValue>.Add 也会引发异......
  • Js中valueOf和toString区别和使用
    对于number、string、Boolean、object、symbol数据类型调用valueOf方法,得到的都是数据本身(null、undefined两种类型上的原型链上没有valueOf方法)点击查看代码vara=1;varaa=a.valueOf();console.log(aa==a);//truevarb='a';......
  • 重写DRF的to_representation和to_internal_value方法有什么用途?
    DRF所有序列化器类都继承了BaseSerializer类,通过重写该类的to_representation()和to_internal_value()方法可以改变序列化和反序列化的行为,比如给序列化后的数据添加额外的数据,或者对客户端API请求携带的数据进行反序列化处理以及用来自定义序列化器字段。to_representation(......
  • 修改序列last_value 字段
    在PostgreSQL中,你不能直接更新序列(如seq_sys_config)的last_value字段,因为序列是一个特殊的系统对象,不允许你像普通表那样直接修改它的列。last_value实际上是序列的一个伪列,表示最后返回的值,但它不是一个可以直接设置的列。如果你想要修改序列的当前值或者重置它,你应该使用......
  • 解决报错:Could not set property 'id' of 'class com.north.domain.Book' with value
    报错原因问题描述:因为MyBatis-Plus默认的id自增策略使用的雪花算法org.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.reflection.ReflectionException:Couldnotsetproperty'id'of'classcom.north.domain.Book'withvalue'1......
  • dotnet 泛型委托 ACTION FUNC
    voidMain(){//泛型委托ACTIONFUNC//3.创建委托实例TestDele<string>testDele=newTestDele<string>(HellowDele);testDele("测试委托");//官方版本的泛型委托(不带返回值)Action<string>action=newAction<string>(HellowDele);......
  • dotnet 冒泡排序
    //Seehttps://aka.ms/new-console-templateformoreinformationusingConsoleApp1;Console.WriteLine("Hello,World!");//我委托你办事情,作为委托方只要满足被委托方的规则的事情(也就是方法),他都可以帮我解决,我需要给它提供金钱(也就是参数)。//总结:就是一些常用(公用的......
  • dotnet 委托delegate的使用 定义和使用
    voidMain(){//委托-初级和高级的分水岭//1.委托的初体验//委托是一个引用类型,其实是一个类型,保存方法的指针(地址)(变量名字都是地址都是指针)//是一个数据类型实际是一个对象(委托对象,函数对象,列表对象)万物都是对象//指针指向一个方法当我......