当前位置: 首页 > news >正文

wpf之依赖属性

前言

依赖属性由于它占用内存小的特点在wpf的自定义控件中得到了广泛应用,本文就来介绍wpf中依赖属性的用法。

1、自定义依赖属性

下面的代码使用 DependencyProperty.Register声明并注册了一个依赖属性,Register方法的4个参数含义如下:
1)属性名称
这里是IsHighlighted
2)属性的类型
IsHighlighted的类型是bool
3)属性所有者类型
IsHighlighted属性属于CustomButton类中的成员,所以为CustomButton
4)属性元数据
PropertyMetadata类型构造函数第一个参数为属性默认值可以设置为false,OnIsHighlightedChanged是属性值改变时的回调函数。

   class CustomButton : Button{public CustomButton(){this.Background = new SolidColorBrush(Colors.Red);//初始化设置为红色}public static readonly DependencyProperty IsHighlightedProperty =DependencyProperty.Register("IsHighlighted", // 属性的名称(与包装器一致)typeof(bool),    // 属性的类型typeof(CustomButton), // 属性所有者的类型(定义该属性的类)new PropertyMetadata( // 属性的元数据false,           // 默认值OnIsHighlightedChanged) // 属性值改变时的回调方法(可选));// 2. 可选的属性值改变回调方法private static void OnIsHighlightedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){// d 是属性值发生改变的那个对象CustomButton的实例)var control = (CustomButton)d;bool newValue = (bool)e.NewValue;bool oldValue = (bool)e.OldValue;// 在这里可以响应属性的变化,例如触发一些逻辑或重绘控件control.UpdateVisualState();}// 3. 标准的 CLR 属性包装器public bool IsHighlighted{get { return (bool)GetValue(IsHighlightedProperty); }set { SetValue(IsHighlightedProperty, value); }}private void UpdateVisualState(){// 根据 IsHighlighted 的值更新控件外观if (IsHighlighted){this.Background = new SolidColorBrush(Colors.Green);//高亮状态逻辑}else{this.Background = new SolidColorBrush(Colors.Red);  // 普通状态逻辑}}}

2、声明一个ViewModelBase类

 public class ViewModelBase{public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged(string propname){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(propname));}}}

3、声明一个ViewModel类继承ViewModelBase

 public  class ViewModel:ViewModelBase{private bool  isHighLight = false ;public bool IsHighLight{get{return isHighLight;}set{this.isHighLight = value;OnPropertyChanged("IsHighLight");}}}

4、窗体类

 public partial class MainWindow : Window{public MainWindow(){InitializeComponent();this.DataContext = new ViewModel();}}

5、xaml代码

下面的代码中CustomButton 的IsHighlighted作为依赖属性绑定了ViewModel中的IsHighLight属性;CheckBox 的IsChecked属性绑定了ViewModel中的IsHighLight属性;这样当我点击CheckBox的时候ViewModel中的IsHighLight属性会改变,IsHighLight属性改变又会改变CustomButton 的IsHighlighted属性,这样就能触发OnIsHighlightedChanged方法,该方法的作用是当IsHighlighted为true时,将CustomButton背景色改成绿色,否则改成红色。

<Window x:Class="wpf之依赖属性.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:wpf之依赖属性"mc:Ignorable="d"Title="依赖属性" Height="450" Width="800"><Grid><StackPanel Orientation="Vertical"  ><local:CustomButton Height=" 100"  IsHighlighted="{Binding IsHighLight}"    /><CheckBox Height=" 100" IsChecked="{Binding  IsHighLight,Mode=TwoWay }"  /></StackPanel ></Grid>
</Window>

CheckBox 选中时的界面:
在这里插入图片描述
CheckBox 取消选中时的界面:
在这里插入图片描述
从这里的效果可以看出CustomButton 的IsHighlighted依赖属性已经成功应用了。

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
7、《C#操作MySql数据库从入门到精通》

http://www.dtcms.com/a/358313.html

相关文章:

  • 具有类人先验知识的 Affordance-觉察机器人灵巧抓取
  • C++_多态和虚构
  • 卡片一放,服务直达!实现信息零层级触达
  • Python实现京东商品数据自动化采集的实用指南
  • (双指针)Leetcode283.移动零-替换数字类别+Leetcode15. 三数之和
  • UI前端大数据可视化实战策略:如何设计符合用户认知的数据可视化界面?
  • 【计算机网络】HTTP是什么?
  • Ansible Playbook 调试与预演指南:从语法检查到连通性排查
  • 一体化步进伺服电机在汽车线束焊接设备中的应用案例
  • MongoDB 源码编译与调试:深入理解存储引擎设计 内容详细
  • HarmonyOS元服务开发
  • 深入解析HarmonyOS:UIAbility与Page的生命周期协同
  • TensorFlow 面试题及详细答案 120道(71-80)-- 性能优化与调试
  • 坚鹏请教DEEPSEEK:请问中国领先的AI智能体服务商有哪些?知行学
  • 深度学习系列 | Seq2Seq端到端翻译模型
  • 离线大文件与断点续传:ABP + TUS + MinIO/S3
  • IAR工程如何搭建vscode+clangd编辑环境
  • 如何使用快照将 AWS OpenSearch 服务中的数据从开发环境复制到生产环境
  • 互联网医院系统优势介绍
  • 嵌入式linux相机(2)
  • 设计模式 - 静态工厂模式 + 策略模式,
  • 【Java后端】MySQL 常见 SQL 语句优化指南
  • AI 赋能综合能源管理系统:开启智慧能源新时代
  • 掌握表单:React中的受控组件与表单处理
  • 详解Vue2、Vue3与React的Diff算法
  • 【Android】OkHttp发起GET请求 POST请求
  • React Router 6 获取路由参数
  • 【自然语言处理与大模型】如何进行大模型多模态微调
  • 【ASP.NET Core】双Token机制在ASP.NET Core中的实现
  • OpenCV 图像形态学操作与边缘检测实战指南