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 属性,看是否可以弹出继承父的TestMessageBox.Show(this.dps.Test.ToString());
}

效果:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速将一个网址打包成一个exe可执行文件

一、电脑需要node环境 如果没有下面有安装教程&#xff1a; node.js安装及环境配置超详细教程【Windows系统安装包方式】 https://blog.csdn.net/weixin_44893902/article/details/121788104 我的版本是v16.13.1 二、安装nativefier 这是一个GitHub上的开源项目&#xff1a…

C 语言函数

1.0 函数的创建和使用 在C语言中&#xff0c;函数是一种封装了特定功能的代码块&#xff0c;可以被程序中的其他部分调用。函数可以接受输入参数&#xff0c;并且可以返回一个值。定义一个函数的基本语法如下 #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" …

阿里云人工智能平台PAI部署开源大模型chatglm3之失败记录--update:最后成功了!

想学习怎么部署大模型&#xff0c;跟着网上的帖子部署了一个星期&#xff0c;然而没有成功。失败的经历也是经历&#xff0c;记在这里。 我一共创建了3个实例来部署chatglm3&#xff0c;每个实例都是基于V100创建的&#xff08;当时没有A10可选了&#xff09;&#xff0c;其显…

x86芯片定制,Ethercat芯片定制,IP服务,适用于运动控制,工业总线等软硬一体机

x86芯片定制&#xff0c;Ethercat芯片定制 X86平台 我们的研发工程师已经积累了非常丰富的主板、整机设计经验&#xff0c;对接您的产品规格场景需求&#xff0c;快速交付样机&#xff0c;包含主板、BOX整机、平板电脑、CPCI等形态产品。降本、长生命周期、快速交付、及时响应…

IEC62056标准体系简介-2.IEC62056标准体系及对象标识系统(OBIS)

1. IEC 62056标准体系 IEC 62056标准体系目前共包括六部分&#xff0c;见图1&#xff1a; 第61部分&#xff1a;对象标识系统第62部分&#xff1a;接口类第53部分&#xff1a;COSEM应用层第46部分&#xff1a;使用HDLC&#xff08;High Level Data Link Control&#xff09;协…

Linux多进程和多线程(八)多线程

多线程 线程定义线程与进程线程资源 线程相关命令 pidstat 命令 top 命令ps 命令常见的并发方案 1. 多进程模式2. 多线程模式 创建线程 1. pthread_create() 示例:创建一个线程 2. pthread_exit() 退出线程3. pthread_join() 等待线程结束 示例: 线程分离 创建多个线程 示例 1:…

前端面试题35(在iOS和Android平台上,实现WebSocket协议有哪些常见的库或框架?)

在iOS和Android平台上&#xff0c;实现WebSocket协议有许多成熟且被广泛使用的库和框架。下面是一些推荐的选项&#xff1a; iOS 平台 SocketRocket 简介&#xff1a;这是由Facebook开源的库&#xff0c;专门为iOS和Mac OS X设计&#xff0c;提供WebSocket连接的功能。它基于S…

Blender新手入门笔记收容所(一)

基础篇 基础操作 视角的控制 控制观察视角&#xff1a;鼠标中键平移视图&#xff1a;Shift鼠标中键缩放视图&#xff1a;滚动鼠标中键滚轮 选中物体后&#xff1a;移动物体快捷键G&#xff0c;移动后单击鼠标就会定下来。 进入移动状态后&#xff1a;按Y会沿着Y轴移动进入移动…

HW期间——应急响应

01HW中应急响应的流程 001应急响应所处位置&#xff08;应急处置组&#xff09; 监控研判组发现的一些安全时间提供给应急处置组&#xff0c;应急处置组通过上机取证把线索给到溯源反制组。但是溯源反制组可能已经没有了&#xff0c;有些单位有&#xff0c;有些单位取消了。有…

Python神经模型评估微分方程图算法

&#x1f3af;要点 &#x1f3af;神经网络映射关联图 | &#x1f3af;执行时间分析 | &#x1f3af;神经网络结构降维 | &#x1f3af;量化图结构边作用 | &#x1f3af;数学评估算法实现 &#x1f36a;语言内容分比 &#x1f347;Python随机梯度下降算法 随机梯度下降是梯度…

matlab仿真 通信信号和系统分析(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第三章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 一、离散傅里叶变换 clear all n0:30;%信号的时间范围 xsin(0.2*n).*exp(-0.1*n); k0:30;%频率范围 N31; Wnkexp(-j*2*pi/N).…

解决本地操作云服务器上的Redis

方案一&#xff1a;开放Redis默认端口&#xff0c;本地通过公网IP端口号的形式访问。 方案二&#xff1a;每次将本地编写好的Java代码打包&#xff0c;放在云服务器上运行。 方案三&#xff1a;配置ssh端口转发&#xff0c;把云服务器的redis端口&#xff0c;映射到本地主机。 …

【大模型】微调实战—使用 ORPO 微调 Llama 3

ORPO 是一种新颖微调&#xff08;fine-tuning&#xff09;技术&#xff0c;它将传统的监督微调&#xff08;supervised fine-tuning&#xff09;和偏好对齐&#xff08;preference alignment&#xff09;阶段合并为一个过程。这减少了训练所需的计算资源和时间。此外&#xff0…

使用微pe装系统

本文仅作为记录&#xff0c;不作为教程。 今天心血来潮想下点游戏玩玩&#xff0c;一看之前分的200gc盘已经红了&#xff0c;再加上大学之后这个笔记本已经用得很少了&#xff0c;于是打算重装电脑。 参考: 微PE辅助安装_哔哩哔哩_bilibil… 1.下载微pe和win10系统到U盘 我这…

Xilinx zc706 USB电路解析

作者 QQ群&#xff1a;852283276 微信&#xff1a;arm80x86 微信公众号&#xff1a;青儿创客基地 B站&#xff1a;主页 https://space.bilibili.com/208826118 参考 USB OTG检测原理 USB3320 USB_ID为低电平时候&#xff0c;为host模式&#xff0c;USB_ID为悬空&#xff08;高…

python-23-零基础自学python open()和replace()函数运用

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版练习10-2 知识点&#xff1a; 打开文件&#xff0c;replace()替换文件内容&#xff0c;open(), 练习内容&#xff1a; 练习10-2:C语言学习笔记 可使用方法replace()将字符串中的特定单词都替换为另一个单…

kafka系列之offset超强总结及消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用Spring的KafkaListener(其实底层也是poll()方法)注解消费Kafka消息时&#xff0c;它都会返回之前被写入Kafka的记录&#xff0c;即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前…

6.824/6.5840 的Debugging by Pretty Printing配置

TA的原文在&#xff1a;Debugging by Pretty Printing (josejg.com) 为了在WSL2中配置好打印运行日志&#xff0c;我可是忙活了一下午。可恶的log配置 首先是安装rich库Textualize/rich: Rich is a Python library for rich text and beautiful formatting in the terminal. …

用于视频生成的扩散模型

学习自https://lilianweng.github.io/posts/2024-04-12-diffusion-video/ 文章目录 3D UNet和DiTVDMImagen VideoSora 调整图像模型生成视频Make-A-Video&#xff08;对视频数据微调&#xff09;Tune-A-VideoGen-1视频 LDMSVD稳定视频扩散 免训练Text2Video-ZeroControlVideo 参…

需求分析|泳道图 ProcessOn教学

文章目录 1.为什么使用泳道图2.具体例子一、如何绘制确定好泳道中枢的角色在中央基于事实来绘制过程不要纠结美观先画主干处理流程再画分支处理流程一个图表达不完&#xff0c;切分子流程过程数不超25 &#xff0c;A4纸的幅面处理过程过程用动词短语最后美化并加上序号酌情加上…