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

WPF核心技术解析与使用示例

WPF核心技术解析与使用示例

一、依赖属性(Dependency Property)详解

1. 依赖属性基础

​核心概念​​:

  • 依赖属性是WPF实现数据绑定、样式、动画等特性的基础
  • 通过属性系统实现高效的内存管理和值继承

​标准定义模式​​:

 
public class MyControl : Control
{// 1. 定义依赖属性标识符public static readonly DependencyProperty MyPropertyProperty =DependencyProperty.Register(nameof(MyProperty),                // 属性名称typeof(string),                    // 属性类型typeof(MyControl),                 // 所属类型new PropertyMetadata("默认值"));   // 默认值和回调// 2. 定义CLR包装属性public string MyProperty{get => (string)GetValue(MyPropertyProperty);set => SetValue(MyPropertyProperty, value);}
}

​关键特性​​:

  • ​值继承​​:子元素可以继承父元素的属性值
  • ​变更通知​​:自动通知UI更新
  • ​存储优化​​:只在值改变时存储实际值
  • ​动画支持​​:可直接用于动画系统

2. 依赖属性元数据

 
new PropertyMetadata(defaultValue: "默认值",                     // 默认值propertyChangedCallback: OnValueChanged,   // 值改变回调coerceValueCallback: CoerceValue,          // 值强制回调isAnimationProhibited: false               // 是否禁止动画
);// 回调示例
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{var control = (MyControl)d;// 处理属性变化逻辑
}private static object CoerceValue(DependencyObject d, object baseValue)
{if (baseValue is string str && str.Length > 10){return str.Substring(0, 10); // 限制最大长度}return baseValue;
}

二、附加属性(Attached Property)详解

1. 附加属性概念

​核心特点​​:

  • 可由非所有者类型定义
  • 可附加到任何DependencyObject上
  • 常用于布局控制(Grid.Row)和行为扩展

​实现示例​​:

 
public class GridHelper
{// 定义附加属性public static readonly DependencyProperty ColumnProperty =DependencyProperty.RegisterAttached("Column",typeof(int),typeof(GridHelper),new PropertyMetadata(0));// CLR包装器public static int GetColumn(DependencyObject obj) => (int)obj.GetValue(ColumnProperty);public static void SetColumn(DependencyObject obj, int value) => obj.SetValue(ColumnProperty, value);
}

​XAML使用​​:

 
<Grid><Button GridHelper.Column="1" Content="附加属性示例"/>
</Grid>

三、命令模式(Commanding)

1. RelayCommand实现

 
public class RelayCommand : ICommand
{private readonly Action<object> _execute;private readonly Predicate<object> _canExecute;public RelayCommand(Action<object> execute, Predicate<object> canExecute = null){_execute = execute ?? throw new ArgumentNullException(nameof(execute));_canExecute = canExecute;}public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);public void Execute(object parameter) => _execute(parameter);public event EventHandler CanExecuteChanged{add { CommandManager.RequerySuggested += value; }remove { CommandManager.RequerySuggested -= value; }}
}

​ViewModel中使用​​:

 
public class MainViewModel : INotifyPropertyChanged
{private string _name;public string Name{get => _name;set { _name = value; OnPropertyChanged(); }}public ICommand SayHelloCommand { get; }public MainViewModel(){SayHelloCommand = new RelayCommand(execute: _ => MessageBox.Show($"Hello, {Name}!"),can

相关文章:

  • WPF框架中异步、多线程、高性能、零拷贝技术的应用示例
  • 二、信息时代社会结构的转变
  • 我爱学算法之—— 二分查找(上)
  • 力扣HOT100——102.二叉树层序遍历
  • 解构与重构:“整体部分”视角下的软件开发思维范式
  • File,IO流,字符集
  • 25【干货】在Arcgis中根据字段属性重新排序并自动编号的方法(二)
  • 基于Tcp协议的应用层协议定制
  • Flask + ajax上传文件(三)--图片上传与OCR识别
  • 安服实习面试面经总结(也适合hvv蓝初)
  • 坚果派已适配的鸿蒙版flutter库【持续更新】
  • 什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?
  • 从“拼凑”到“构建”:大语言模型系统设计指南!
  • 【开源】基于51单片机的温湿度检测报警系统
  • WPF实现类似Microsoft Visual Studio2022界面效果及动态生成界面技术
  • 矫平机终极指南:特殊材料处理、工艺链协同与全球供应链管理
  • AI日报 - 2025年04月26日
  • 嵌入式学习笔记 - HAL_xxx_MspInit(xxx);函数
  • Prometheus、Zabbix和Nagios针对100个节点的部署设计架构图
  • Python基于Django的全国二手房可视化分析系统【附源码】
  • 我国核电总体规模首次跃居世界第一,发电量持续增长
  • 兵韬志略|美菲“肩并肩”军演超越传统范畴,凸显防务合作重大转型
  • 关键词看中国经济“一季报”:稳,开局良好看信心
  • 罗马教皇方济各葬礼在梵蒂冈举行
  • 四川一国企“80后”掌门人为报领导“知遇之恩”,盲目决策致数亿损失
  • 阿联酋启动第三届全球航空奖评选,奖金总额达百万美元