WPF 初识依赖属性

依赖属性的意义和作用

  • 核心模块
  • 内存共享,节省空间
  • 数据绑定、样式、模板、动画。。。。
  • 如果没有依赖属性,这个框架就是一个控件框架 相当于Winform

依赖属性的基本定义

基本过程:声明、注册、包装

在需要写依赖属性的类中,继承DependencyObject,或者DependencyObject以下的类都行:

声明

public static readonly DependencyProperty ValueProperty;

注意:

声名 DependencyProperty

约定:名字命名为:名字+Property

readonly 只能被赋值一次,不能被二次修改

注意:readonly这里的只读是限制注册的,不包含里面的值,所以可以动态赋值SetValue

注册

基本的三个参数: 属性名称、属性类型、所属类型(所使用的类的名称)

ValueProperty = DependencyProperty.Register(
    "Value",
    typeof(double),
    typeof(DependencyPropertyStudy));

包装

将依赖属性,包装成普通属性,修改和创建

必须继承DependencyObject及以上的类,才可以写GetValue和SetValue:

 public double Value
 {
     get { return (double)GetValue(ValueProperty); }
     set
     {
         SetValue(ValueProperty, value);
     }
 }

代码片段:propdp

输入propdp + tab 自动生成

和上面注册是一样的,不过多了一个默认值(PropertyMetadata),加粗的部分是需要自定义的,根据自己的需求来。

 public int MyProperty
 {
     get { return (int)GetValue(MyPropertyProperty); }
     set { SetValue(MyPropertyProperty, value); }
 }

 // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
 public static readonly DependencyProperty MyPropertyProperty =
     DependencyProperty.Register(
     "MyProperty", 
     typeof(int), 
     typeof(ownerclass), 
     new PropertyMetadata(0));

依赖属性的主要参数与回调参数

默认值

ValueProperty = DependencyProperty.Register(
    "Value",
    typeof(double),
    typeof(DependencyPropertyStudy));
属性值变化回调:
ValueProperty = DependencyProperty.Register(
    "Value",
    typeof(double),
    typeof(DependencyPropertyStudy),
    new PropertyMetadata(
        1d,
        new PropertyChangedCallback(OnValueChanged)));

// 属性值变化回调参数
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    // 静态回调 本方法体的非静态方法
    (d as DependencyPropertyStudy).Refresh();
}

属性值变化的时候,进入此回调函数e.NewValue 将被修改。

如果调用成功 这里将之后对应的依赖值发生了变化

当两次值一样的时候,不触发

验证回调:
ValueProperty = DependencyProperty.Register(
    "Value",
    typeof(double),
    typeof(DependencyPropertyStudy),
    new PropertyMetadata(
        1d),
    new ValidateValueCallback(OnValueValidation));


/// <summary>
/// 对数据的判断结果 编译能触发限制报错信息
/// 需要强制回调的时候,就不要给验证信息False 否则不走强制回调
/// </summary>
/// <param name="v">依赖属性所接受到的最新的值</param>
/// <returns>对数据的判断结果</returns>
private static bool OnValueValidation(object v)
{
    //if((double)v > 2000d)
    //    return false;
    return true;
}
强制回调
ValueProperty = DependencyProperty.Register(
    "Value",
    typeof(double),
    typeof(DependencyPropertyStudy),
    new PropertyMetadata(
        1d,
        new PropertyChangedCallback(OnValueChanged),
        new CoerceValueCallback(OnValueCoerce)));

// 强制回调参数
// 如果值超限,可以强制改回需要的值范围
 private static object OnValueCoerce(DependencyObject d, object v)
 {
     if ((double)v > 255d)
         return 255d;
     if ((double)v < 0d)
         return 0d;
     return v;
 }

完整代码:三个回调一起

 ValueProperty = DependencyProperty.Register(
     "Value",
     typeof(double),
     typeof(DependencyPropertyStudy),
     new PropertyMetadata(
         1d,
         new PropertyChangedCallback(OnValueChanged),
         new CoerceValueCallback(OnValueCoerce)),
     new ValidateValueCallback(OnValueValidation));

 // 属性值变化回调:处理的是监听属性值的变化
 private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
 {
     
     // 如果调用成功 这里将之后对应的依赖值发生了变化
     // 当两次值一样的时候,不触发
     // 静态回调 本方法体的非静态方法
     (d as DependencyPropertyStudy).Refresh();
 }

 /// <summary>
 /// 对数据的判断结果 编译能触发限制报错信息
 /// </summary>
 /// <param name="v">依赖属性所接受到的最新的值</param>
 /// <returns>对数据的判断结果</returns>
 private static bool OnValueValidation(object v)
 {
     //if((double)v > 2000d)
     //    return false;
     return true;
 }

 // 强制回调参数
 private static object OnValueCoerce(DependencyObject d, object v)
 {
     if ((double)v > 255d)
         return 255d;
     if ((double)v < 0d)
         return 0d;
     return v;
 }

执行顺序:

验证回调(首先给个默认值验证) --> 加载方法(load) --> 强制回调 --> 属性变化回调 --> 验证回调

元数据:FrameworkPropertyMetadataOptions

 public double ColumnSpace
 {
     get { return (double)GetValue(ColumnSpaceProperty); }
     set { SetValue(ColumnSpaceProperty, value); }
 }

 // Using a DependencyProperty as the backing store for ColumnSpace.  This enables animation, styling, binding, etc...
 public static readonly DependencyProperty ColumnSpaceProperty =
     DependencyProperty.Register(
         "ColumnSpace",
         typeof(double), 
         typeof(XHPanel),
         //new PropertyMetadata(0d,new PropertyChangedCallback(OnColumnSpaceChanged))
         // AffectsArrange: 影响排列  AffectsMeasure:影响测量 
         // 如果有多个用"|"分开
         new FrameworkPropertyMetadata(0d,FrameworkPropertyMetadataOptions.AffectsArrange 
             | FrameworkPropertyMetadataOptions.AffectsMeasure)
         );

此元数据使用在自定义控件的时候,修改属性时刷新UI是使用

扩展:FrameworkPropertyMetadataOptions 的属性:
None:未指定任何选项;依赖属性使用 WPF 属性系统的默认行为。
AffectsMeasure:更改此依赖属性的值会影响布局组合的测量过程。
AffectsArrange:更改此依赖属性的值会影响布局组合的排列过程。  
AffectsParentMeasure:更改此依赖属性的值会影响父元素上的测量过程。 
AffectsParentArrange:更改此依赖属性的值会影响父元素上的排列过程。  
AffectsRender:更改此依赖属性的值会影响呈现或布局组合的某一方面(不是测量或排列过程)。 
Inherits:此依赖属性的值将由子元素继承。
OverridesInheritanceBehavior:此依赖属性的值跨越分隔的树以实现属性值继承。
NotDataBindable:不允许将数据绑定到此依赖属性。
BindsTwoWayByDefault:此依赖属性上的数据绑定的 System.Windows.Data.BindingMode 默认为 System.Windows.Data.BindingMode.TwoWay。
Journal:此依赖属性的值应由日记记录进程或在由统一资源标识符 (URI) 导航时进行保存或存储。
SubPropertiesDoNotAffectRender:此依赖属性值上的子属性不会影响呈现的任何方面。

依赖属性的继承

允许元素树中的子元素从最近的父元素获取特定属性的值

由于父元素也可能通过属性值继承获得其属性值,因此系统可能递归回页面根

父亲依赖属性代码:

public int Test
 {
    get { return (int)GetValue(TestProperty); }
    set { SetValue(TestProperty, value); }
}

// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty TestProperty =
    DependencyProperty.Register("Test", typeof(int), typeof(XHPanel),
                                 new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.Inherits));

子类继承代码:

关键字:父类.依赖属性.AddOwner(类型,默认值)

 public int Test
 {
     get { return (int)GetValue(TestProperty); }
     set { SetValue(TestProperty, value); }
 }

 // 依赖属性的继承 继承于XHPanel 的 TestProperty
 // 允许元素树中的子元素从最近的父元素获取特定属性的值
 // 由于父元素也可以通过属性值继承获得其属性值,因此系统可能地归回页面根
 public static readonly DependencyProperty TestProperty =
     XHPanel.TestProperty.AddOwner(
         typeof(DependencyPropertyStudy),
         new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.Inherits));

演示:XAML代码

<local:XHPanel Test="12" ColumnSpace="20" RowSpace="20" Visibility="Collapsed">
  <local:DependencyPropertyStudy x:Name="dps" />
</local:XHPanel>
<Button Width="200" Height="30"
  Content="测试依赖属性继承" FontSize="20" Click="Button_Click"/>

按钮事件代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    // 此时子没设置Test 属性,看是否可以弹出继承父的Test
    MessageBox.Show(this.dps.Test.ToString());
}

效果:

以上就是所有的依赖属性的基础使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【EI稳定检索】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

>>>【独立出版&#xff0c;Ei稳定检索】<<< 第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024年09月20-22日 | 中国温州 一轮截稿时间&#xff1a;2024年7月8日 二轮截稿时间&#xff1a;2024年8月5日 大会简介 *会议…

深度学习之梯度消失

在深度学习中&#xff0c;梯度消失是指在反向传播过程中&#xff0c;随着网络层数增加或者在使用特定类型的激活函数&#xff08;如sigmoid函数&#xff09;时&#xff0c;梯度逐渐变小并最终趋近于零的现象。这种现象导致在更新参数时&#xff0c;底层网络的权重几乎不会得到有…

RSRS研报复现——年化21.5%,含RSRS标准分,右偏标准分的Backtrader指标计算(代码+数据)

原创文章第583篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 继续Backtrader&#xff0c;今天讲讲指标扩展。 作为规则型的量化框架&#xff0c;指标是非常重要的元素&#xff0c;它是策略的基础。 我们来扩展一个经典的指标&#xff0c;RSR…

解决:Flink向kafka写数据使用Producer精准一次(EXACTLY_ONCE)异常

在使用flink向kafka写入数据报错&#xff1a;Caused by: org.apache.kafka.common.KafkaException: Unexpected error in InitProducerIdResponse; The transaction timeout is larger than the maximum value allowed by the broker (as configured by transaction.max.timeou…

【云岚到家】-day05-2-预约下单-系统开发

【云岚到家】-day05-2-预约下单-系统开发 1 预约下单系统开发1.1 订单号生成规则1.1.1 常见的订单号生成规则1.1.2 本项目订单号生成规则1.1.3 代码实现 1.2 下单接口实现1.2.1 Mapper实现1.2.2 Service实现1.2.3 Controller1.2.4 测试 1.3 下单代码优化1.3.1 事务方法存在远程…

自动化一些操作

下拉选择框 from selenium import webdriver from time import sleep # 导包 from selenium.webdriver.support.select import Select driver webdriver.Edge() driver.get(r"D:\WORK\ww\web自动化_day01_课件笔记资料代码\web自动化_day01_课件笔记资料代码\02_其他资料…

Collection接口及遍历集合的方式Iterator接口、增强for循环的介绍和使用

Collection接口 概述&#xff1a;单列集合的顶级接口格式&#xff1a;其中泛型决定了集合中能存储什么类型的数据&#xff0c;可以统一元素类型&#xff0c;泛型中只能写引用数据类型&#xff0c;如果不写&#xff0c;默认Object类型。等号前面的泛型必须写&#xff0c;等号后…

收银系统源代码-收银端UI风格

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给商户提供含线下收银称重、线上商城、精细化会员管理、ERP进销存、丰富营销活动、移动店务助手等一体化的解决方案。 如Windows版收银&#xff08;exe安装包&#xff09;、安卓版收银&#xff08;apk安装包&#…

PID控制与模糊PID控制的比较

一、PID控制器的设计 1.PID控制原理图&#xff1a; PID控制其结构框图如下图所示&#xff1a; 图1&#xff1a;PID控制器结构框图 2.PID控制器传递函数的一般表达式 PID控制器传递函数的一般表达形式为&#xff1a; 其中kp为比例增益&#xff1b;ki为积分增益&#xff1b;k…

学习笔记——动态路由——IS-IS中间系统到中间系统(IS-IS工作过程)

六、IS-IS工作过程 1、第一步&#xff1a;建立邻居关系 IS-IS网络中所有路由器之间实现通信&#xff0c;主要通过以下几个步骤&#xff1a; (1)邻居关系建立&#xff1a; 邻居关系建立主要是通过HELLO包交互并协商各种参数&#xff0c;包括链路类型(level-1/level-2)&#…

详细分析Spring中的@Configuration注解基本知识(附Demo)

目录 前言1. 基本知识2. 详细分析3. Demo3.1 简单Bean配置3.2 属性配置3.3 多条件配置 4. 实战拓展 前言 Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;Spring框架从入门到学精&#xff08;全&am…

k8s集群如kubeadm init和kube-flannel.yam问题

查看k8s中角色内容kubectl get all (显示pod和server以及delment) 删除应用资源选择删除先删除部署查看部署和pod没了服务还在&#xff0c;但资源和功能以及删除&#xff0c;删除服务kubectl delete 服务名&#xff08;部署名&#xff09;&#xff0c;get pods 获取默认空间的容…

毛细管计算软件

思科普毛细管计算软件 输入部分&#xff1a; 一是制冷剂的选取&#xff0c;含常用制冷剂R134A R600A R407C等 A输入热负荷 B蒸发温度 C冷凝温度 D回气温度 毛细管的选项&#xff0c;根据不同内径对应不同长度的毛细管

详细分析@FunctionalInterface的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;Spring框架从入门到学精&#xff08;全&#xff09; 1. 基本知识 FunctionalInterface 是 Java 8 引入的一个注…

apache:the requested operation has failed使用httpd -t

Apache24\bin cmd 回车 httpd -t 因为我重新压缩了&#xff0c;记住&#xff0c;重新压缩要使用原路径&#xff0c; 因为你安装的 时候使用的是原路径 还是不行就改个端口&#xff0c;切记修改配置文件httpd.conf先把Tomcat停了 Define SRVROOT "F:\Apache\Apache24&q…

从生物学到机械:人眼如何为机器人视觉系统提供无尽灵感?

人眼激发了相机机制的发展&#xff0c;该机制改善了机器人对周围世界的观察和反应方式。 该摄像头系统由马里兰大学&#xff08;UMD&#xff09;计算机科学家领导的团队开发&#xff0c;模仿人眼用于保持清晰稳定的视力的不自主运动。 该团队对相机的原型设计和测试称为…

警惕!焦虑过度的这些症状正在悄悄侵蚀你的生活!

在快节奏的现代社会中&#xff0c;焦虑已成为许多人生活的一部分。适度的焦虑可以激发我们的斗志&#xff0c;推动我们前进。然而&#xff0c;当焦虑过度时&#xff0c;它可能会变成一把双刃剑&#xff0c;对我们的身心健康造成严重威胁。本文将探讨焦虑过度的表现&#xff0c;…

机器视觉/自然语言/生成式人工智能综合应用实验平台-实训平台-教学平台

AIGC是人工智能1.0时代进入2.0时代的重要标志&#xff0c;MIT 科技评论也将Al合成数据列为2022年十大突破性技术之一&#xff0c;甚至将生成性Al(Generative Al) 称为是AI领域过去十年最具前景的进展。同时&#xff0c;AIGC领域岗位需求数量暴涨。高校方面在人工智能专业与机器…

文献笔记|综述|When Large Language Model Meets Optimization

When Large Language Model Meets Optimization 题目&#xff1a;当大型语言模型遇到优化时 作者&#xff1a;Sen Huang , Kaixiang Yang , Sheng Qi and Rui Wang 来源&#xff1a;arXiv 单位&#xff1a;华南理工大学 文章目录 When Large Language Model Meets Optimization…

【android 9】【input】【10.发送按键事件4——View的分发流程】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…