WPF 初识依赖属性

news2024/11/15 21:47:21

依赖属性的意义和作用

  • 核心模块
  • 内存共享,节省空间
  • 数据绑定、样式、模板、动画。。。。
  • 如果没有依赖属性,这个框架就是一个控件框架 相当于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.coloradmin.cn/o/1911041.html

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

相关文章

Axure第12享:Google加载Axure扩展程序

1、需求描述 在双击打开RP文件进行预览时&#xff0c;提示要为Google浏览器加载Extension&#xff08;扩展程序&#xff09;&#xff0c;如下图所示。 2、解决思路 按照系统指导的操作步骤&#xff0c;但要注意1点&#xff0c;加载“扩展程序”时是选择整个文件夹&#xff0c…

3款ui设计师必备的高效软件,一定要收藏!

UI设计小伙伴们&#xff0c;你们是否在寻找那些能够让设计工作事半功倍的插件呢&#xff1f;今天&#xff0c;我要为大家带来3款UI设计软件中的高效软件&#xff0c;它们不仅能够极大提升我们的工作效率&#xff0c;还能让我们的设计更加专业和精致。让我们一起来看看这些不容错…

动手学深度学习54 循环神经网络

动手学深度学习54 循环神经网络 1. 循环神经网络RNN2. QA 1. 循环神经网络RNN h t h_t ht​ 与 h t − 1 h_{t-1} ht−1​ x t − 1 x_{t-1} xt−1​有关 x t x_t xt​ 与 h t h_t ht​ x t − 1 x_{t-1} xt−1​ 有关 怎么把潜变量变成RNN–假设更简单 潜变量和隐变量的区…

透明加密软件核心技术分享|十款好用的透明加密软件分享

透明加密软件的核心技术在于其能够自动、实时地对文件进行加密和解密&#xff0c;而这个过程对最终用户来说是无感的。这种技术在不改变用户操作习惯的前提下&#xff0c;增强了数据的安全性。下面是透明加密软件的一些核心技术要点。 实时加密与解密&#xff1a;软件在文件被打…

虚拟内存【Linux】

虚拟内存 为什么需要虚拟内存Linux虚拟内存的结构32位系统下的虚拟地址空间64位系统下的虚拟地址空间页表多级页表TLB 流程虚拟内存的作用 为什么需要虚拟内存 为了在进行多进程编码进行内存访问的时候保持内存的隔离性&#xff0c;数据安全性&#xff0c;所以出现了虚拟内存。…

C++--智能指针

普通指针创建动态内存的问题: 1.new和new[]的内存需要使用delete和delete []释放。 2.有时忘记释放内存。 3.不知该在何时释放内存。 智能指针的优点: 在不需要对象时自动释放对象&#xff0c;从而避免内存泄漏和其他与内存管理相关的问题。 智能指针有:unique_ptr,share…

可转债之强赎条款

摘要&#xff1a;每天学习一点金融小知识 做可转债投资&#xff0c;强赎风险是特别需要注意的&#xff0c;若投资者没有及时采取措施&#xff0c;就有可能造成很大的损失。本文从可转债的定义、强赎条款的原因及强赎的情况几个方面来介绍下可转债的强赎条款。 什么是可转换债券…

算法——同步算法

在力扣有这样一道题求交集&#xff0c;与此类似的还有求差集&#xff0c;相关的解法有很多。我这里提供一种思路&#xff1a;利用C的容器set对这两个数组去重&#xff0c;遍历数组插入set即可去重。再同时遍历比较set的每个元素。 代码实现很简单&#xff0c;如下所示&#xff…

【第四届会后4个月检索】第五届计算机网络安全与软件工程国际学术会议(CNSSE 2025)

第五届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2025&#xff09; 2025 5th International Conference on Computer Network Security and Software Engineering 重要信息 大会官网&#xff1a;www.cnsse.org 大会时间&#xff1a;2025年2月21-23日 会议地点&…

CTF-PWN-kernel-栈溢出(retuser rop pt_regs ret2dir)

文章目录 参考qwb2018 core检查逆向调试打包上传测试脚本retuserkernel ropinit_credcommit_creds( prepare_kernel_cred(0) )开启KPTI利用swapgs_restore_regs_and_return_to_usermode开启KPTI利用SIGSEGVrop设置CR3寄存器再按照没有KPTI返回 kernel rop ret2userpt_regs 构造…

使用命令行修改Ubuntu 24.04的网络设置

Ubuntu里&#xff0c;使用命令行下修改IP地址&#xff0c;网上有很多方案&#xff0c;我最终觉得这个方案&#xff08;使用Netplan&#xff09;最好&#xff0c;最根本&#xff0c;记录下来备查 1.使用命令ip link show 查看Ubuntu上可以使用的网络接口名称 2.查找Netplan的配…

全志T527 适配YT8531 双以太网

一、确认硬件接口 phy1&#xff1a; phy2&#xff1a; PHY 地址设置&#xff1a; YT8531 的地址由上图所示的三个管脚外接 ( 或内部默认 ) 电阻来配置。外部不接上下拉电阻时&#xff0c;内部默认 phy 地址为 000( 十进制 0) &#xff1b;若外接电阻&#xff0c;例如上图所接…

前端面试题33(实时消息传输)

前端实时传输协议主要用于实现实时数据交换&#xff0c;特别是在Web应用中&#xff0c;它们让开发者能够构建具有实时功能的应用&#xff0c;如聊天、在线协作、游戏等。以下是几种常见的前端实时传输协议的讲解&#xff1a; 1. Short Polling (短轮询) 原理&#xff1a;客户…

二分查找3

1. 有序数组中的单一元素&#xff08;540&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 二分查找解题关键就在于去找到数组的二段性&#xff0c;这里数组的二段性是从单个数字a开始出现然后分隔出来的&#xff0c;如果mid落入左半部分那么当mid为偶数时nums[mid1]…

搞清楚[继承],易如反掌

穷不失义&#xff0c;达不离道。——孔丘《论语》 继承 1、简单理解2、继承2、1、继承的概念2、2、继承定义2、3、基类和派生类对象赋值转换2、4、继承中的作用域2、5、派生类默认成员函数2、6、继承中的特点2、6、1、友元2、6、2、静态成员2、6、3、菱形继承及菱形虚拟继承 3、…

【开源】基于RMBG的一键抠图与证件照制作系统【含一键启动包】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

2024浙江外国语学院汉语桥线上项目 “在杭州,看见更好的中国”开班

7月9日上午&#xff0c;由教育部中外语言交流合作中心主办、浙江外国语学院国际商学院承办的2024汉语桥“在杭州&#xff0c;看见更好的中国”线上项目正式启动。项目负责人何骅老师及汉语桥教师团队&#xff0c;与来自越南、缅甸、日本、俄罗斯的100名学员相聚云端&#xff0c…

JavaSE学习笔记第二弹——对象和多态(上)

目录 面向对象基础 面向对象程序设计的定义 类的基本结构 成员变量 成员方法 方法定义与使用 设计练习 方法重载 构造方法 静态变量和静态方法 String和StringBuilder 基本含义 区别 总结 今天我们继续来学习JavaSE&#xff0c;扩展和Java相关的知识&#xff0c;…

当CNN遇上Mamba,高性能与高效率通通拿下!

传统视觉模型在处理大规模或高分辨率图像时存在一定限制&#xff0c;为解决这个问题&#xff0c;研究者们就最近依旧火热的Mamba&#xff0c;提出了Mamba结合CNN的策略。 这种结合可以让Mamba在处理长序列数据时既能够捕捉到序列中的时间依赖关系&#xff0c;又能够利用CNN的局…