WPF中依赖属性或附加属性的继承

引言

我们可以轻易的编写一个附加属性类,增加任意类型的附加属性并编写一定的逻辑来处理附加值的变化通知。假如控件是我们自定义的一个label、button 、textbox等,自定义控件当然是其他基础类型元素的组合,如shape、line、rectangle、geometry等对齐进行了装饰和功能增强,我们不希望重新编写或更改较多的窗体xaml代码,可以使用附加属性继承的方式,将附加属性传递到子元素,通过更改其控件模板实现极大程度上控件外观的重塑。

1、控件模板概述

WPF 中的许多控件使用 ControlTemplate 定义控件的结构和外观,因为它可以将控件的外观和功能区分开来。 重新定义 ControlTemplate 可以极大地更改控件的外观。 例如,假设需要在标签或左上角显示一个小圆点,以不同颜色表示状态。 由于 Label 使用控件模板定义外观,因此很容易重新定义 ControlTemplate 以符合该控件的要求,从而使用Label来制作交通信号灯。

尽管有些时候可以使用 DataTemplate,但在某些时候,光有 DataTemplate 还不够。 DataTemplate 定义控件内容的外观。 当外观要求与默认外观存在很大差异,有必要重新定义 ControlTemplate。 一般情况下,DataTemplate 用于定义控件的内容(或数据),ControlTemplate 用于定义控件的构成方式。

参阅:控件创作概述 - WPF .NET Framework | Microsoft Learn

UserControlXaml代码生成控件,无法使用 DataTemplate 或 ControlTemplate 来自定义其外观。
Control能通过 ControlTemplate 进行自定义,支持不同主题
FrameworkElement对控件的外观进行精确控制,而不仅仅是简单的元素组合提供的效果。可定义自己的呈现逻辑。重写 FrameworkElement 的 OnRender 方法,并提供显式定义组件视觉对象的 DrawingContext 操作。

2、可继承附加属性编写与使用

这里主要使用到 FrameworkPropertyMetadata 类型

官方注解此类派生自 PropertyMetadata () UIPropertyMetadata ,是专门为WPF 框架级应用程序开发目的准备的,此类是对基类PropertyMetadata的补充 ,包含指定或报告 WPF 框架级属性系统行为(如属性继承、数据绑定和布局)的各种布尔属性。

重点关注它的枚举参数类型FrameworkPropertyMetadataOptions

AffectsArrange2

更改此依赖属性的值会触发布局组合的排列过程。

AffectsMeasure1

更改此依赖属性的值会触发布局组合的测量过程。

AffectsParentArrange8

更改此依赖属性的值会触发父元素上的排列过程。

AffectsParentMeasure4

更改此依赖属性的值会触发父元素上的测量过程。

AffectsRender16

更改此依赖属性的值会触发呈现或布局组合的某一方面(不是测量或排列过程)。

BindsTwoWayByDefault256

此依赖属性上的数据绑定的 BindingMode 默认为 TwoWay。

Inherits32

此依赖属性的值将由子元素继承。容器控件嵌套

Journal1024

此依赖属性的值应由日记记录进程或在由统一资源标识符 (URI) 导航时进行保存或存储。

None0

未指定任何选项;依赖属性使用 WPF 属性系统的默认行为。

NotDataBindable128

不允许将数据绑定到此依赖属性。

OverridesInheritanceBehavior64

此依赖属性的值跨越分隔的树以实现属性值继承。

SubPropertiesDoNotAffectRender2048

此依赖属性值上的子属性不会影响呈现的任何方面。

如果不用继承,在更改了控件样式之后,我们通过附加属性更改其外观,则需要逐项去修改附加属性的值。如下:

<StackPanel wh:StatusDotElement.DotBrush="Red" wh:StatusDotElement.Radius="5">
    <Label Style="{DynamicResource StatusDotLabel}" Content="label1" wh:StatusDotElement.DotBrush="Red"/>
    <Label Style="{DynamicResource StatusDotLabel}" Content="label2" wh:StatusDotElement.DotBrush="Red"/>
    <Label Style="{DynamicResource StatusDotLabel}" Content="label3" wh:StatusDotElement.DotBrush="Red"/>
    <Label Style="{DynamicResource StatusDotLabel}" Content="label4" wh:StatusDotElement.DotBrush="Red"/>
</StackPanel>

这里重新定义了Label控件模板,附加属性只提供值进行绑定。在左上角添加了一个小圆点。

<ControlTemplate TargetType="Label">
    <hc:SimplePanel>
.....此处省略
        <Ellipse
            Margin="5"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Fill="{Binding Path=(attach:StatusDotElement.DotBrush), RelativeSource={RelativeSource TemplatedParent}}"
            Height="{Binding Path=(attach:StatusDotElement.Radius), RelativeSource={RelativeSource TemplatedParent}}"
            Width="{Binding Path=(attach:StatusDotElement.Radius), RelativeSource={RelativeSource TemplatedParent}}" />
    </hc:SimplePanel>

</ControlTemplate>

使用了继承之后只需设置一次:

<StackPanel wh:StatusDotElement.DotBrush="Red" wh:StatusDotElement.Radius="5">
    <Label Style="{DynamicResource StatusDotLabel}" Content="label1"/>
    <Label Style="{DynamicResource StatusDotLabel}" Content="label2"/>
    <Label Style="{DynamicResource StatusDotLabel}" Content="label3"/>
    <Label Style="{DynamicResource StatusDotLabel}" Content="label4"/>
</StackPanel>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/874776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

针对SVM算法初步研究

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;心态决定高度&#xff0c;细节决定成败…

从OracleCloudWorld和财报看Oracle的转变

2024年9月9-12日Oracle Cloud World在美国拉斯维加斯盛大开幕 押注AI和云 Oracle 创始人Larry Ellison做了对Oracle战略和未来愿景的主旨演讲&#xff0c;在演讲中Larry将AI技术和云战略推到了前所未有的高度&#xff0c;从新的Oracle 23c改名到Oracle23ai&#xff0c;到Oracl…

活动|华院计算宣晓华受邀出席“AI引领新工业革命”大会,探讨全球科技的最新趋势

8月31日&#xff0c;“AI引领新工业革命”大会于上海图书馆圆满落幕。本次大会由TAA校联会和台协科创工委会联合主办&#xff0c;得到上海市台办、上海市台联、康师傅的大力支持。大会邀请了NVIDIA全球副总裁、亚太区企业营销负责人刘念宁&#xff0c;元禾厚望资本创始合伙人潘…

828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统

828华为云征文&#xff5c;华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&a…

[Web安全 网络安全]-文件包含漏洞

文章目录&#xff1a; 一&#xff1a;前言 1.什么是文件包含漏洞 2.文件包含漏洞的成因 3.文件包含漏洞的分类 4.文件包含漏洞的防御策略 5.文件包含函数&#xff08;触发点Sink&#xff09; 6.环境 6.1 靶场 6.2 其他工具 二&#xff1a;文件包含LFI labs靶场实验…

docker-01 创建一个自己的镜像并运行容器

docker-01 创建一个自己的镜像并运行容器 前言 我们都知道使用Docker的镜像可以快速创建和部署应用&#xff0c;大大的节约了部署的时间。并且Docker 的镜像提供了除内核外完整的运行时环境&#xff0c;确保代码的环境一致性&#xff0c;从而不会在出现这段代码在我机器上没问…

YoloV10改进策略:上采样改进|动态上采样|轻量高效,即插即用(适用于分类、分割、检测等多种场景)

摘要 本文使用动态上采样改进YoloV10,动态上采样是今天最新的上采样改进方法,具有轻量高效的特点,经过验证,在多个场景上均有大幅度的涨点,而且改进方法简单,即插即用! 论文:《DySample:Learning to Upsample by Learning to Sample》 论文:https://arxiv.org/pdf/…

老旧电力系统安全隐患增加 该如何预防电气线路老化等因素引发的电气火灾呢?

为应对我国电气火灾事故频发的挑战&#xff0c;安科瑞电气股份有限公司开发了AcrelCloud-6000安全用电管理云平台。这一平台依托移动互联网和云计算技术&#xff0c;结合物联网传感器&#xff0c;将办公楼、学校、医院、工厂、体育场馆、宾馆及福利院等人员密集场所的电气安全数…

0x07 Nginx越界读取缓存漏洞 CVE-2017-7529 复现

参考&#xff1a; Nginx越界读取缓存漏洞 CVE-2017-7529 | PeiQi文库 (wgpsec.org)Nginx越界读取缓存漏洞&#xff08;CVE-2017-7529&#xff09;复现分析 - qweg_focus - 博客园 (cnblogs.com) 一、fofa 搜索 nginx && port"80" 我这里写了个脚本将ip保存…

启明云端乐鑫代理商,乐鑫ESP32无线芯片方案,物联网设备WiFi联动控制

随着智能和远程技术的飞速发展&#xff0c;物联网(IoT)逐渐出现在我们生活的每一个角落。乐鑫以其创新的无线通信技术&#xff0c;正成为智能家居、工业自动化和医疗设备等领域的推动者。 无线WiFi芯片模组不仅提供了强大的数据处理能力&#xff0c;还赋予了设备以直观的交互方…

Web 基础——Apache

Event Worker 的升级版、把服务器进程和连接进行分析&#xff0c;基于异步 I/O 模型。 请求过来后进程并不处理请求&#xff0c;而是直接交由其它机制来处理&#xff0c;通过 epoll 机制来通知请求是否完成&#xff1b; 在这个过程中&#xff0c;进程本身一直处于空闲状态&am…

Qt常用控件——QLCDNumber

文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件&#xff0c;类似于这样&#xff1a; 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5&#xff0c;in…

第十一周:机器学习

第十一周周报 摘要Abstract机器学习1. 注意力机制&#xff08;下&#xff09;1.1 multi-head self-attention&#xff08;多头注意力机制&#xff09;1.2 Positional Encoding&#xff08;位置编码&#xff09;1.3 truncated self attention&#xff08;截断式注意力机制&#…

即插即用篇 | YOLOv8 引入高效的直方图Transformer模块 | 突破天气障碍:Histoformer引领高效图像修复新路径“

本改进已同步到YOLO-Magic框架! 摘要:摘要。基于Transformer的恶劣天气图像修复方法取得了显著进展。大多数方法通过沿通道维度或在空间上固定范围的块内使用自注意力,以减少计算负担。然而,这种折中方式在捕获长距离空间特征方面存在局限性。受到恶劣天气导致的退化因素主…

黑马点评18——多级缓存-OpenResty

文章目录 安装OpenRestyOpenResty快速入门OpenResty获取请求参数封装Http请求向Tomcat发送http请求根据商品id对tomcat集群负载均衡Redis缓存预热查询Redis缓存Nginx本地缓存 安装OpenResty 安装参考博客 OpenResty快速入门 nginx是没有业务能力的&#xff0c;我们是把请求转发…

NLP基础及其代码-BERT系列

1.基础知识 BERT系列RoBERTa ALBERT ERINE详解与使用学习笔记-腾讯云开发者社区-腾讯云 (tencent.com) 2.BERT 分词&#xff1a;wordpiece 预训练&#xff1a; mask&#xff1a;选择15%的分词进行mask&#xff08;80%mask 10%随机替换分词 10%分词保持不变&#xff09; NSP…

替换传统数据处理平台,TDengine 与华风数据达成合作

在全球能源转型的大背景下&#xff0c;新能源产业正迎来前所未有的发展机遇。随着国家对可再生能源的政策支持和市场需求的不断增长&#xff0c;风电、光伏和储能等新能源项目如雨后春笋般蓬勃发展。然而&#xff0c;随之而来的数据处理与管理挑战也日益凸显。面对海量的设备运…

构建常态化安全防线:XDR的态势感知与自动化响应机制

当前&#xff0c;网络安全威胁日益复杂多变&#xff0c;企业正面临前所未有的严峻挑战。为有效应对这些挑战&#xff0c;态势感知与自动化响应机制在提升网络安全运营效率与防御效果中扮演着至关重要的角色。它们能够实时监测网络状态&#xff0c;智能分析潜在威胁&#xff0c;…

Spring Cloud之二 微服务注册

1&#xff1a;Intellij 新建服务 user-service 2&#xff1a;pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"…

[leetcode-python]杨辉三角2

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1]提示…