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

第二章-依赖属性

1、依赖属性

  依赖属性使用效率更高的保存机制,并支持附加功能,如更改通知(change notification)以及属性值继承(在元素树中向下传播默认属性值的能力)。

  依赖项属性也是WPF许多重要功能的基础,包括动画、数据绑定以及样式,在代码中仍可以使用与读取和设置传统的.NET属性相同的方式来读取和设置依赖项属性。

 

2、应用场景

  1、要求属性支持绑定

  2、自定义/拓展控件属性

  3、支持验证/强制回调

  4、属性继承

  5、附加属性

 

3、依赖属性定义

  VS当中使用propdp可创建依赖属性

    public class Dp:DependencyObject{//定义public static readonly DependencyProperty AgeProperty;//注册static Dp(){//第一个参数为xaml当中应当显示的属性名称//第二个参数:该属性的类型//第三个参数:该属性所属类型//第四个参数:默认值AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new PropertyMetadata(0));}//包装public int Age{get { return (int)GetValue(AgeProperty); }set { SetValue(AgeProperty, value); }}}

 

4、依赖属性值改变回调  

  在PropertyMetadata当中当中传入一个回调函数

  public class Dp:Panel{//定义public static readonly DependencyProperty AgeProperty;//注册static Dp(){//第一个参数为xaml当中应当显示的属性名称//第二个参数:该属性的类型//第三个参数:该属性所属类型//第四个参数:默认值AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new PropertyMetadata(0,OnAgeChange));}/// <summary>/// 改变回调函数/// </summary>/// <param name="d">发出该改变的依赖对象</param>/// <param name="e">发生的事件</param>private static void OnAgeChange(DependencyObject d, DependencyPropertyChangedEventArgs e){//业务代码//e.NewValue//e.OldValue
}//包装public int Age{get { return (int)GetValue(AgeProperty); }set { SetValue(AgeProperty, value); }}}

 

5、依赖属性验证回调

  在DependencyProperty.Register注册方法当中传入回调函数

 public class Dp:Panel{//定义public static readonly DependencyProperty AgeProperty;//注册static Dp(){//第一个参数为xaml当中应当显示的属性名称//第二个参数:该属性的类型//第三个参数:该属性所属类型//第四个参数:默认值AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new PropertyMetadata(0,OnAgeChange),new ValidateValueCallback(OnAgeChangeValid));}private static bool OnAgeChangeValid(object value){//验证逻辑return true;}//包装public int Age{get { return (int)GetValue(AgeProperty); }set { SetValue(AgeProperty, value); }}}

 

6、依赖属性的强制回调

  在PropertyMetadata当中当中传入一个回调函数

  static Dp(){//第一个参数为xaml当中应当显示的属性名称//第二个参数:该属性的类型//第三个参数:该属性所属类型//第四个参数:默认值AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new PropertyMetadata(0,OnAgeChange,ForceCallBack),new ValidateValueCallback(OnAgeChangeValid));}

 

7、依赖属性继承  

   AgeProperty = DependencyProperty.Register("Age",typeof(int),typeof(Dp),new FrameworkPropertyMetadata(0,FrameworkPropertyMetadataOptions.Inherits),     );
    public class Class1:Control{public int StuAge{get { return (int)GetValue(StuAgeProperty); }set { SetValue(StuAgeProperty, value); }}// Using a DependencyProperty as the backing store for StuAge.  This enables animation, styling, binding, etc...public static readonly DependencyProperty StuAgeProperty =DpTest.AgeProperty.AddOwner( typeof(Class1),new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.Inherits));}

 

8、附加属性

  使用propa快捷键可快速创建

   public class AttachTest{//包装public static int GetCustPwdProperty(DependencyObject obj){return (int)obj.GetValue(CustPwdProperty);}public static void SetCustPwdProperty(DependencyObject obj, int value){obj.SetValue(CustPwdProperty, value);}// 定义、注册public static readonly DependencyProperty CustPwdProperty =DependencyProperty.RegisterAttached("CustPwdProperty", typeof(string), typeof(AttachTest), new PropertyMetadata(""));}

 

 <PasswordBox local:AttachTest.CustPwdProperty="{Binding Pwd}" Width="60" Height="30"></PasswordBox>

 

将PasswordBox与附加属性之间建立联系:

  

 //附加属性public class AttachTest{//包装public static string GetCustPwdProperty(DependencyObject obj){return (string)obj.GetValue(CustPwdProperty);}public static void SetCustPwdProperty(DependencyObject obj, string value){obj.SetValue(CustPwdProperty, value);}// 定义、注册public static readonly DependencyProperty CustPwdProperty =DependencyProperty.RegisterAttached("CustPwdProperty", typeof(string), typeof(AttachTest), new PropertyMetadata("", OnCustPwdPropertyChanged));//当附加属性变化时将PasswordBox的Password修改为附加属性的值private static void OnCustPwdPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){string pwd = (string)e.NewValue;PasswordBox passwordBox = d as PasswordBox;//弱转换if (passwordBox != null){passwordBox.Password = pwd;}}//当PasswordBox的Password变化时将附加属性修改为Password的值public static bool GetOrderProperty(DependencyObject obj){return (bool)obj.GetValue(OrderProperty);}public static void SetGetOrderProperty(DependencyObject obj, bool value){obj.SetValue(OrderProperty, value);}// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...public static readonly DependencyProperty OrderProperty =DependencyProperty.RegisterAttached("OrderProperty", typeof(bool), typeof(AttachTest), new PropertyMetadata(true, OnOrderPropertyChanged));private static void OnOrderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){PasswordBox passwordBox = d as PasswordBox;if (passwordBox != null){passwordBox.PasswordChanged -= OnPasswordChanged;passwordBox.PasswordChanged += OnPasswordChanged;}}private static void OnPasswordChanged(object sender, RoutedEventArgs e){PasswordBox dp = sender as PasswordBox;SetCustPwdProperty(dp, dp.Password);}}

 

http://www.jsqmd.com/news/84342/

相关文章:

  • 量子计算驱动的分布式云存储系统在数据安全与高效检索中的创新应用 - 教程
  • css3如何引入外部字体
  • ARM 架构中的数据内存屏障指令 DMB
  • 【视频导图大师】3秒批量导出视频所有画面为高清图片/序列帧/视频截图/视频转图片
  • test tagstest tags - itnews
  • 终极指南:解锁Quansheng对讲机隐藏功能的完整方案
  • 终极指南:CinoLib——免费开源的通用网格处理神器
  • test tags2 - itnews
  • 光隔离探头
  • 窗口相关操作的总结
  • TileLang终极指南:45分钟内打造你的首个高性能GPU算子
  • 5分钟掌握Transition.css:让你的网页动起来
  • AI大模型之Agent,RAG,LangChain(二)
  • 技术周报 | 特朗普签令统一AI监管;长三角启动应用征集;多场开发者大会本周密集召开
  • 恢复条码至compvalue里
  • 北京陪诊服务权威推荐榜单 - 品牌排行榜单
  • HNOI2019《序列》
  • 峰值检测电路
  • 基于Java的安全生产投诉智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 【Godot】【入门】Godot 是什么?适合做哪些类型的游戏(附路线图+避坑清单)
  • 北京上门收画服务权威推荐榜单​ - 品牌排行榜单
  • 从零到一:构建一个实时语音翻译应用(Vue3 + Web Speech API)
  • 前端性能与监控指标采集系统设计方案
  • PWA资产生成器终极教程:5分钟快速创建专业级图标和启动画面
  • 基于PyTorch的深度学习基础课程之十:损失函数
  • 学习Linux要注意的地方
  • 43、Python 并发与网络编程全解析
  • Spark:革命性的命令行数据可视化工具,让DevOps监控更高效
  • [技术讨论] 三极管高低温特性测试
  • 12306反反爬虫策略:Python网络请求优化实战