示例:WPF中应用DependencyPropertyDescriptor监视依赖属性值的改变

一、目的:开发过程中,经常碰到使用别人的控件时有些属性改变没有对应的事件抛出,从而无法做处理。比如TextBlock当修改了IsEnabled属性我们可以用IsEnabledChanged事件去做对应的逻辑处理,那么如果有类似Background属性改变我想找对应的事件该如何处理,本文介绍DependencyPropertyDescriptor的应用,用该类可以监视到Background改变的处理


二、演示

可以看到,当修改TextBlock的Background属性时,Text的值也做出相应改变。 

三、环境


VS2022

四、实现

相关代码

定义一个ComboBox去修改Textblock的Backround属性

            <DockPanel><ComboBox x:Name="cbb_dpd" DockPanel.Dock="Top"><SolidColorBrush Color="Yellow"/><SolidColorBrush Color="Orange"/><SolidColorBrush Color="Purple"/><SolidColorBrush Color="Green"/></ComboBox><TextBlock x:Name="g_dpd" TextAlignment="Center" FontSize="100" VerticalAlignment="Stretch" Background="{Binding ElementName=cbb_dpd,Path=SelectedItem}"/></DockPanel>

应用 DependencyPropertyDescriptor注册Textblock的Background改变时的响应事件

      public MainWindow(){InitializeComponent();var dependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(TextBlock.BackgroundProperty, typeof(TextBlock));dependencyPropertyDescriptor.AddValueChanged(this.g_dpd, (s, e) =>{this.g_dpd.Text = this.g_dpd.Background.ToString();});}

核心代码是

首先,用一个依赖属性定义一个DependencyPropertyDescriptor

 var dependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(TextBlock.BackgroundProperty, typeof(TextBlock));

之后,用DependencyPropertyDescriptor将想要监视的Textblock注册通知

          dependencyPropertyDescriptor.AddValueChanged(this.g_dpd, (s, e) =>
          {
              this.g_dpd.Text = this.g_dpd.Background.ToString();
          });

同理其他依赖属性改变也可以用此方法处理,比如常见的ListBox的ItemsSource属性改变没有通知,我们就可以用此方法处理如果数据源改变了我们要做一些刷新处理。

五、需要了解的知识点

DependencyPropertyDescriptor 类 (System.ComponentModel) | Microsoft Learn

PropertyDescriptor 类 (System.ComponentModel) | Microsoft Learn

DependencyProperty Class (System.Windows) | Microsoft Learn

TextBlock 类 (System.Windows.Controls) | Microsoft Learn

TextBlock.Background 属性 (System.Windows.Controls) | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Atcoder Beginner Contest 359

传送门 A - Count Takahashi 时间限制&#xff1a;2秒 内存限制&#xff1a;1024MB 分数&#xff1a;100分 问题描述 给定 N 个字符串。 第 i 个字符串 () 要么是 Takahashi 要么是 Aoki。 有多少个 i 使得 等于 Takahashi &#xff1f; 限制 N 是整数。每个…

[240623] ShellScript 视角下的 Ruby | Tiobe 2406 - C++ 超 C;Fortran 老当益壮

目录 [TOC](目录)ShellScript 视角下的 Ruby引言Ruby 用于 Shell 脚本的优势结论 Tiobe 2406 - C 超 C&#xff1b;Fortran 老当益壮 ShellScript 视角下的 Ruby 引言 Ruby 常与 Rails 框架联系在一起&#xff0c;导致许多人忽略了它本身的强大。Ruby 是一门功能丰富且完整的…

应用安全(补充)

《重要信息系统灾难恢复指南》将灾难恢复能力分为6级&#xff1a;等级1&#xff08;最低级&#xff0c;基本支持&#xff09;、等级2&#xff08;备用场地支持&#xff09;、等级3:&#xff08;电子传输和设备支持&#xff09;、等级4&#xff08;电子传输及完整设备支持&#…

探索ChatTTS项目:高效的文字转语音解决方案

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f4d2; ChatTTS &#x1f4d2;&#x1f4dd; 项目介绍&#x1f4dd; 项目亮点&#x1f4dd; UI &#x1f388; 项目地址 &#x1f388; &#x1f4d6; 介绍 &#x1f4d6; 在AI技术迅速发展的今天&#xff0c;文本到语音&…

指令调度基本概念

概述 为了提高处理器执行指令的并行度&#xff0c;处理器将计算机指令处理过程拆分为多个阶段&#xff0c;并通过多个硬件处理单元&#xff0c;将不同指令处理的前后阶段重叠并行执行&#xff0c;形成流水线(pipeline) 处理器的流水线结构是处理器微架构最基本的要素&#xf…

React@16.x(36)路由v5.x(1)简单介绍

目录 1&#xff0c;前言2&#xff0c;相关知识点介绍2.1&#xff0c;react-router 和 react-router-dom 的关系2.2&#xff0c;2种路由模式2.2.1&#xff0c;Hash 哈希路由2.2.2&#xff0c;Borswer History 浏览器历史路由 3&#xff0c;React 路由组件3.1&#xff0c;Route 相…

数据类型 运算符

基本数据类型与引用数据类型的区分 存储内容&#xff1a; 基本数据类型&#xff1a;直接存储实际的数据值&#xff0c;如整数、浮点数、字符等。引用数据类型&#xff1a;存储对象的引用&#xff08;内存地址&#xff09;&#xff0c;而不是对象本身。 内存分配&#xff1a; 基…

本地离线模型搭建指南-本地运行显卡选择

搭建一个本地中文大语言模型&#xff08;LLM&#xff09;涉及多个关键步骤&#xff0c;从选择模型底座&#xff0c;到运行机器和框架&#xff0c;再到具体的架构实现和训练方式。以下是一个详细的指南&#xff0c;帮助你从零开始构建和运行一个中文大语言模型。 本地离线模型搭…

打印机状态显示错误是什么原因?这5个有效方法要记好!

打印机是现代办公中不可或缺的设备之一&#xff0c;但在使用过程中&#xff0c;打印机状态显示错误是一个常见的问题。本文将详细探讨打印机状态显示错误的原因及其解决方法。 摘要 打印机状态显示错误的原因及解决方法如下&#xff1a; 1、网络连接问题&#xff1a;原因&…

Spring响应式编程之Reactor核心组件

Reactor核心组件 Flux和Mono组件&#xff08;1&#xff09;Flux组件&#xff08;2&#xff09;Mono组件 Flux和Mono组件 Reactor 框架提供了两个核心组件来发布数据&#xff0c;分别是 Flux 和 Mono 组件。两者都是实现Publisher接口的高级抽象&#xff0c;可以说是应用程序开…

LLM agentic模式之reflection:SELF-REFINE、Reflexion、CRITIC

SELF-REFINE SELF-REFINE出自2023年3月的论文《Self-Refine: Iterative Refinement with Self-Feedback》&#xff0c;考虑到LLM第一次生成结果可能不是最好的输出&#xff0c;提出一种包括反馈(feedback)和改善(refinement)两个步骤的迭代方法来改进LLM的初始输出。 基本思路…

【Orange Pi 5与Linux系统编程】-POSIX消息队列

Linux系统中的POSIX消息队列编程 文章目录 Linux系统中的POSIX消息队列编程1、POSIX 消息队列2、Linux 中的 POSIX 消息队列命名3、POSIX 消息队列调用3.1 mq_open, mq_close3.2 mq_timed_send、mq_send、mq_timed_receive、mq_receive3.3 mq_notify3.4 mq_unlink3.5 mq_getatt…

【Java】已解决java.lang.FileNotFoundException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.lang.FileNotFoundException异常 在Java编程中&#xff0c;java.lang.FileNotFoundException是一个常见的异常&#xff0c;它通常表示程序试图打开一个不存在的文件、文…

打包体积分析和优化

webpack分析工具&#xff1a;webpack-bundle-analyzer 1. 通过<script src"./vue.js"></script>方式引入vue、vuex、vue-router等包&#xff08;CDN&#xff09; // webpack.config.js if(process.env.NODE_ENVproduction) {module.exports {devtool:…

python之mysql数据库的操作

对数据库的操作 &#xff1a; 1 数据库的登录和登出&#xff1a; 登录 终端执行&#xff1a;mysql -uroot -p&#xff1b; 再输入密码&#xff1b; 登出 quit 或exit 2 显示当前的时间&#xff1a; select now() 3 查看所有的数据库&#xff1a; show databases&#…

使用Let‘s Encrypt 申请通配符证书

为什么不使用阿里云/腾讯云等公有云厂商提供的免费证书? 上篇介绍了从阿里云上面申请免费证书,有效期一年 为网站配置https证书 公有云提供的证书不支持通配符&#xff0c;只支持某个确定的解析。 不管是二级域名还是三级域名&#xff0c;只要是具体的确定的地址&#xff0c;都…

spring 、springboot 运行的原理、理解、分析

Spring 和 Spring Boot 是非常流行的 Java 框架&#xff0c;它们的运行原理和设计哲学帮助开发者构建现代化的企业级应用。在这里&#xff0c;我们将深入探讨它们的运行原理、设计理念及其背后的机制。 Spring 框架 1. 核心概念和组件 IoC&#xff08;Inversion of Control&…

代码随想录训练营Day31

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、分发饼干二、摆动序列三、最大子树组合 前言 今天是跟着代码随想录刷题的第31天&#xff0c;主要学习了分发饼干&#xff0c;摆动序列和最大子树组合这三个…

号外!号外!全网第一手Android P刘海屏适配大揭秘,唯一Kotlin算法

如下图所示&#xff1a; 4.2.适配刘海屏 在刘海屏调试打开之后&#xff0c;浏览应用的所有页面&#xff0c;测试所有遮挡问题&#xff0c;或者是下移导致的问题&#xff0c;对有问题的页面进行布局适配。适配方案如下&#xff1a; Google 提供的适配方案&#xff0c;可以设置…

使用VisualBox+Vagrant搭建Centos虚拟机环境

1.下载并安装VisualBox&#xff1b; 2.下载并安装Vagrant; 3.打开cmd窗口&#xff0c;执行命令vagrant init centos/7&#xff0c;初始化centos环境&#xff0c;该步骤受网络带宽影响&#xff0c;可能挂级30分钟到1个小时&#xff1b; 4.启动虚拟机&#xff1a;vagrant up&…