WPF依赖附加属性

依赖附加属性的定义

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

依赖附加属性必须在依赖对象,附加属性不一定,关注的是被附加的对象是否是依赖对象

快捷方式:propa + tab

关键字:RegisterAttached

// 方法封装
public static int GetIndex(DependencyObject obj)
{return (int)obj.GetValue(IndexProperty);
}public static void SetIndex(DependencyObject obj, int value)
{obj.SetValue(IndexProperty, value);
}// 声明与注册
public static readonly DependencyProperty IndexProperty =DependencyProperty.RegisterAttached("Index", typeof(int), typeof(XHPanel), new PropertyMetadata(-1));

依赖附加属性的意义和作用

1. 用来辅助布局(布局控件与子控件的关系)

一般容器控件提供给子控件使用的,如果Grid.Row

使用方式:在容器控件中检查每个子项,从子项中获取附加属性的值 容器对象调用对应的GetValue方法,传入给被附加对象

a. 自定义控件的附加属性

父亲的属性:

// 方法封装
public static int GetIndex(DependencyObject obj)
{return (int)obj.GetValue(IndexProperty);
}public static void SetIndex(DependencyObject obj, int value)
{obj.SetValue(IndexProperty, value);
}// 声明与注册
public static readonly DependencyProperty IndexProperty =DependencyProperty.RegisterAttached("Index", typeof(int), typeof(XHPanel), new PropertyMetadata(-1));

使用方法:

可以在子控件中都使用Index属性

<local:XHPanel Test="12" ColumnSpace="20" RowSpace="20" Visibility="Collapsed"><Border Height="100" Background="Red" local:XHPanel.Index="1" /><Border Height="100" Background="Orange" local:XHPanel.Index="2" /><Border Height="100" Background="Yellow" local:XHPanel.Index="3"/><Border Height="100" Background="Green" local:XHPanel.Index="4"/><Border Height="100" Background="LightGreen" local:XHPanel.Index="5"/><Border Height="100" Background="Blue" local:XHPanel.Index="6"/><local:DependencyPropertyStudy local:XHPanel.Index="7" x:Name="dps" Background="Purple" Height="100"/>
</local:XHPanel>

在执行布局的时候,可以获取每个子控件的Index,进行不一样的布局:

获取部分的核心代码:

protected override Size ArrangeOverride(Size finalSize)
{for (int i = 1; i < newElements.Count+1; i++){var index = GetIndex(item); // 获取对应对象的Index 附加属性值}// 根据index的不一样,进行不一样的布局.....return base.ArrangeOverride(finalSize);
}
2. 用来扩展绑定属性(单独应对对象功能)

一般对接特定对象,比如PasswordBox

使用方法:定义一个类,在类定义相关附加属性,利用这些附加属性进行数据与控件属性的转接

需求:PasswordBox中的password属性不可以绑定,不是依赖属性,但是我这边又需要动态赋值,所以,此时需要写个扩展属性:

核心代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;namespace XH.PropertyLesson
{public class PWHelper{public static string GetPassword(DependencyObject obj){return (string)obj.GetValue(PasswordProperty);}/// <summary>/// 设置Password/// </summary>/// <param name="obj">所附加的对象</param>/// <param name="value"></param>public static void SetPassword(DependencyObject obj, string value){obj.SetValue(PasswordProperty, value);}// Using a DependencyProperty as the backing store for Password.  This enables animation, styling, binding, etc...public static readonly DependencyProperty PasswordProperty =DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PWHelper), new PropertyMetadata("",new PropertyChangedCallback(OnPasswordChanged)));// 1、可以获取到对应的控件 PasswordBox// 2、关联两个方向//    - 从绑定到控件//    - 从控件到绑定(针对拿到的控件进行PasswordChanged事件的绑定)/// <summary>/// Password修改回调函数/// </summary>/// <param name="DependencyObject">实际附加的对象</param>/// <param name="e"></param>/// <exception cref="NotImplementedException"></exception>private static void OnPasswordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var control = (d as PasswordBox);if (control == null) return;control.Password = e.NewValue as string;}private static void Control_PasswordChanged(object sender, RoutedEventArgs e){SetPassword((DependencyObject)sender, (sender as PasswordBox).Password);}public static object GetAttached(DependencyObject obj){return (object)obj.GetValue(AttachedProperty);}public static void SetAttached(DependencyObject obj, object value){obj.SetValue(AttachedProperty, value);}// 挂载事件public static readonly DependencyProperty AttachedProperty =DependencyProperty.RegisterAttached("Attached", typeof(object), typeof(PWHelper), new PropertyMetadata(null,new PropertyChangedCallback(OnAttachedChanged)));private static void OnAttachedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var control = (d as PasswordBox);if (control == null) return;// 防止多次附加事件 可以先减 后加control.PasswordChanged -= Control_PasswordChanged; control.PasswordChanged += Control_PasswordChanged; }}
}

xaml使用代码:

<PasswordBox PasswordChar="*" Height="30" Width="100" local:PWHelper.Password="{Binding }"local:PWHelper.Attached="1"/>

使用:

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

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

相关文章

Unity3d C#实现基于UGUI ScrollRect的轮播图效果功能(含源码)

前言 轮播功能是一种常见的页面组件&#xff0c;用于在页面中显示多张图片/素材并自动或手动进行切换&#xff0c;以提高页面的美观度和用户体验。主要的功能是&#xff1a;自动/手动切换;平滑的切换效果;导航指示器等。可惜Unity的UGUI系统里没有现成的实现该功能&#xff0c…

第五次作业(多表联合查询)

新增员工表emp和部门表dept create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (102,销售…

Shell学习——Shell echo命令

文章目录 echo命令 echo命令 1.显示普通字符串: echo "It is a test"这里的双引号完全可以省略&#xff0c;以下命令与上面实例效果一致&#xff1a; echo It is a test2.显示转义字符 echo "\"It is a test\""结果将是: "It is a tes…

掌握MOJO命令行:参数解析的艺术

在软件开发中&#xff0c;命令行接口&#xff08;CLI&#xff09;是一种与程序交互的强大方式&#xff0c;它允许用户通过终端输入指令和参数来控制程序的行为。对于MOJO语言&#xff0c;即使它是一个假想的编程语言&#xff0c;我们也可以设想它具备解析命令行参数的能力。本文…

初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

前言 C是一种通用的编程语言&#xff0c;被广泛用于开发各种应用程序&#xff0c;包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展&#xff0c;添加了许多新特性和功能&#xff0c;并支持面向对象编程。C可以在不同的平台上编译和运行&#xff0c;具有高效性、可…

开放式耳机哪个品牌比较好?2024最值得推荐的火爆机型!!

在这个快节奏的时代&#xff0c;我们都在寻找那些既能让我们享受音乐&#xff0c;又能保持对外界感知的音频设备。开放式耳机以其独特的设计&#xff0c;满足了这一需求&#xff0c;它们让你在享受音乐的同时&#xff0c;还能听到周围环境的声音&#xff0c;无论是安全出行还是…

华为、H3C、锐捷、思科四大设备厂商交换机配置命令总结合辑

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 一直以来&#xff0c;对于华为、H3C、锐捷、思科交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;四…

OpenSNN推文:盛夏智慧之光:七月高校新闻聚焦

随着夏日的炎炎热浪逐渐升温&#xff0c;七月的校园生活也如火如荼地展开。在这个充满活力的季节里&#xff0c;各大高校不仅迎来了学术交流的高峰&#xff0c;也在科技创新、国际合作等方面取得了显著成就。以下是本月内几所知名高校的重要新闻动态&#xff0c;它们不仅展现了…

数据库 视图

-- 删除旧的视图&#xff08;如果存在&#xff09; DROP VIEW IF EXISTS view_employees_active; -- 创建新的视图 CREATE VIEW view_employees_active AS SELECT id, name FROM employees WHERE status active; 注意事项 如果视图不满足更新条件&#xff08;如包含JOIN、…

谱瑞科技高速传输接口芯片选型应用

谱瑞科技股份有限公司为一专供多种普及显示器以及个人计算机、消费性电子产品与显示面板所使用之高速讯号传输接口标准之混和信号 IC 芯片之领导供货商。谱瑞公司成立于 2005 年为一无自有晶圆厂之半导体公司&#xff0c;并于 2011 年股票在台湾柜台买卖中心正式挂牌交易(股票代…

深入浅出:Scikit-Learn基础教程

引言 Scikit-Learn&#xff08;简称sklearn&#xff09;是Python中一个强大的机器学习库&#xff0c;提供了丰富的工具和模块&#xff0c;帮助我们轻松实现数据预处理、模型训练、评估和预测。本文将通过一个简单的教程&#xff0c;带您快速入门Scikit-Learn&#xff0c;掌握其…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

C语言希尔排序详解与实例

希尔排序&#xff08;Shell Sort&#xff09;&#xff0c;是由Donald Shell在1959年提出的一种排序算法。它是插入排序的一种高效改进版&#xff0c;通过引入“增量”概念&#xff0c;将原本的线性查找转换为分段查找&#xff0c;从而显著提升了排序效率。本文将深入探讨希尔排…

SRC漏洞挖掘技巧:修改返回包的各种姿势

听说大家都在要星标&#xff0c;我也要一个吧&#xff0c;可以把我的公众号打上小星星吗&#xff1f;~ 又双叕周一了&#xff0c;还是老样子&#xff0c;来篇技术向的给大家提提神吧~ 如果你对漏洞挖掘或技术向不感兴趣&#xff0c;那么到这就可以了&#xff0c;不用再继续往下…

【删库跑路】一次删除pip下载的所有第三方库方法

进入命令行&#xff0c;先list看下库存 pip list导出所有的第三方库至一文件列表 pip freeze >requirements.txt按照列表卸载所有库 pip uninstall -r requirements.txt -y再list看下&#xff0c;可见库存已清空

1、课程导学(react+区块链实战)

1、课程导学&#xff08;react区块链实战&#xff09; 1&#xff0c;课程概述&#xff08;1&#xff09;课程安排&#xff08;2&#xff09;学习前提&#xff08;3&#xff09;讲授方式&#xff08;4&#xff09;课程收获 2&#xff0c;ibloackchain&#xff08;1&#xff09;安…

java:字符缓冲流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;写一行行分隔符&#xff0c;行分隔符字符串由系统属性定义 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;读一行文字&#xff0c;结果包含行的内容的字…

振动分析-11-轴承数据库之深度学习一维故障分类Transformer

Pytorch-Transformer轴承故障一维信号分类(三) 1 制作数据集 import pandas as pd filename = "CWRU_1797.csv" df = pd.read_csv(filename)from sklearn.model_selection import train_test_split df_x=df.drop(labels=1024,axis=1)

AI赋能OFFICE 智能化办公利器!

ONLYOFFICE在线编辑器的最新版本8.1已经发布&#xff0c;整个套件带来了30多个新功能和432个bug修复。这个文档编辑器无疑成为了办公软件中的翘楚。它不仅支持处理文本文档、电子表格、演示文稿、可填写的表单和PDF&#xff0c;还允许多人在线协作&#xff0c;并支持AI集成&…

java Pair怎么使用

文章目录 1. 简介2. Pair类的来源3. 如何使用Pair类4. Pair类的实际应用5. Pair类的优点和缺点 1. 简介 什么是Pair Pair是一个通用的数据结构&#xff0c;用于存储一对关联的对象&#xff0c;也就是两个元素。这两个元素可以是任何类型&#xff0c;并且它们之间没有特定的层次…