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

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
http://www.xdnf.cn/news/2224.html

相关文章:

  • 【Redis】基础2:作为缓存
  • 力扣刷题Day 31:删除链表的倒数第N个结点(19)
  • Linux之netlink(2)libnl使用介绍(1)
  • 6.2 内容生成与营销:个性化内容创作与营销策略优化
  • WPF大数据展示与分析性能优化方向及代码示例
  • ASP.NET MVC​ 入门指南三
  • 【JavaEE】Spring AOP的注解实现
  • ApplicationRunner的run方法与@PostConstruct注解
  • RPCRT4!NdrConformantStructUnmarshall函数分析
  • 模拟地与数字地单点接地的原理
  • 深度解析APPSCAN漏洞扫描:从入门到实战的全流程指南
  • 如何使用URDF搭建双臂UR移动机器人,并在RViz中可视化
  • c++11 :智能指针
  • QCustomPlot QCPItemText文字框可拖动
  • 关于vant4的showImagePreview在使用时可能出现布局显示不正常、缩放后拖动失效问题的粗暴解决方案
  • Jetbrains和Webstorm中设置自定义指令右键快捷键(自定义外部工具)
  • 检测特权访问活动:一个新的 Kibana 集成
  • [C]基础13.深入理解指针(5)
  • C++学习-入门到精通-【1】C++编程入门,输入/输出和运算符
  • Windows 10 系统关机后立即重启
  • 利用TTP协议 ETag + 路由守卫 实现前端发版后通知用户更新得一个方案
  • 过去 vs 现在:创业门槛的颠覆性变化
  • 系统架构师2025年论文《论软件架构评估2》
  • 什么是CN2专线?全面解析中国电信的高性能网络服务
  • 中国头部云服务商分析
  • SQL问题分析与诊断(8)——分析方法3
  • 【Deepseek学习大模型推理】MOONCAKE: A KVCache-centric Architecture实验部分(下)
  • 前端如何获取样式图里面的标准颜色RGB
  • 11.AOP开发
  • 【C语言】全局变量、静态本地变量