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://xiahunao.cn/news/3225002.html

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

相关文章

4.MkDocs样式

学习 Admonitions(警告) - Material for MkDocs (wdk-docs.github.io) 提示 - Material for MkDocs 中文文档 (llango.com) Buttons(按钮) - Material for MkDocs (wdk-docs.github.io) 建议去看这些网站&#xff0c;更为详细。 常用功能 便利贴 ​​ 开启 markdown_ex…

FL Studio 24.1.1.4234 (Windows) / 24.1.1.3884 (Mac OS X)

FL Studio 24.1.1.4234 (Windows) / 24.1.1.3884 (Mac OS X) 主页多媒体音频编辑FL Studio 24.1.1.4234 (Windows) / 24.1.1.3884... FL Studio 图标 FL Studio&#xff08;前身为 FruityLoops&#xff09;是一款功能强大的音乐制作环境或数字音频工作站&#xff08;DAW&#x…

基于Java的科大讯飞大模型API调用实现

写在前面&#xff1a;因为现在自己实习的公司新拓展的一个业务是结合AI的低代码平台&#xff0c;我负责后端的开发&#xff0c;之前一直都是直接使用gpt或者文心一言等ui界面来直接使用大模型&#xff0c;从来没有自己调接口过&#xff0c;所以本文记录一下自己第一次使用大模型…

【密码学】分组密码概述

一、分组密码的定义 分组密码和流密码都是对称密码体制。 流密码&#xff1a;是将明文视为连续的比特流&#xff0c;对每个比特或字节进行实时加密&#xff0c;而不将其分割成固定的块。流密码适用于加密实时数据流&#xff0c;如网络通信。分组密码&#xff1a;是将明文数据…

【无聊找点事干】局域网内把window 搭建为代理服务器上网

场景描述 同一局域网内&#xff0c;server 2012可以上网&#xff0c;window 10无法上网。现在将电脑server 2012设置为代理服务器&#xff0c;使得window 10可以通过server 2012访问公网。 server 2012&#xff1a;服务端 安装代理服务器软件&#xff1a;CCProxy点击‘设置’…

『大模型笔记』GraphRAG:利用复杂信息进行发现的新方法!

GraphRAG:利用复杂信息进行发现的新方法! 文章目录 一. GraphRAG:利用复杂信息进行发现的新方法!1. 将RAG应用于私人数据集2. 整个数据集的推理3. 创建LLM生成的知识图谱4. 结果指标5. 下一步二. 参考文献微软官方推文:https://www.microsoft.com/en-us/research/blog/gra…

综合安全防护

题目 1,DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问. 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMz区的FTP服务器和HTTP服务器,仅能ping通10.0.3.10 4,办公区分为市场部和研发部,研…

activemq-CVE-2022-41678

Apache ActiveMQ Jolokia 后台远程代码执行漏洞 Apache ActiveMQ在5.16.5&#xff0c;5.17.3版本及以前&#xff0c;后台Jolokia存在一处任意文件写入导致的远程代码执行漏洞。 启动环境 admin/admin 方法一&#xff1a;利用poc 这个方法受到ActiveMQ版本的限制&#xff0c;因…

化妆品3D虚拟三维数字化营销展示更加生动、真实、高效!

随着人们越来越追求高速便捷的生活工作方式&#xff0c;企业在营销市场也偏国际化&#xff0c;借助VR全景制作技术&#xff0c;将企业1:1复刻到云端数字化世界&#xff0c;能带来高沉浸式的逼真、震撼效果。 通过我们独特的漫游点自然场景过渡技术&#xff0c;您将置身于一个真…

Java | Leetcode Java题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack {Queue<Integer> queue;/** Initialize your data structure here. */public MyStack() {queue new LinkedList<Integer>();}/** Push element x onto stack. */public void push(int x) {int n queue.size();…

Qt Creator仿Visual Studio黑色主题

转自本人博客&#xff1a;Qt Creator仿Visual Studio黑色主题 1.演示 配置文件和步骤在后面&#xff0c;先看成品&#xff0c;分别是QWidget和QML的代码编写界面&#xff1a; 2. 主题配置文件 下载链接&#xff1a;QtCreator _theme_VS_dark.xml 也可以自己新建一个xml文件&…

理解局域网技术:从基础到进阶

局域网&#xff08;LAN&#xff09;是在20世纪70年代末发展起来的&#xff0c;起初主要用于连接单位内部的计算机&#xff0c;使它们能够方便地共享各种硬件、软件和数据资源。局域网的主要特点是网络为一个单位所拥有&#xff0c;地理范围和站点数目均有限。 局域网技术在计算…

后端——全局异常处理

一、老办法try-catch 当我们执行一些错误操作导致程序报错时&#xff0c;程序会捕捉到异常报错&#xff0c;这个异常会存在一个Exception对象里 那我们在spring boot工程开发时&#xff0c;当我们执行一个sql查询时报错了&#xff0c;那就会从最底层的Mapper层捕捉到Exceptio…

《RWKV》论文笔记

原文出处 [2305.13048] RWKV: Reinventing RNNs for the Transformer Era (arxiv.org) 原文笔记 What RWKV(RawKuv):Reinventing RNNs for the Transformer Era 本文贡献如下&#xff1a; 提出了 RWKV 网络架构&#xff0c;结合了RNNS 和Transformer 的优点&#xff0c;同…

Golang | Leetcode Golang题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; type MyStack struct {queue []int }/** Initialize your data structure here. */ func Constructor() (s MyStack) {return }/** Push element x onto stack. */ func (s *MyStack) Push(x int) {n : len(s.queue)s.queue append(s.queu…

基于信号量的生产者消费者模型

文章目录 信号量认识概念基于线程分析信号量信号量操作 循环队列下的生产者消费者模型理论认识代码部分 信号量 认识概念 信号量本质: 计数器 它也叫做公共资源 为了线程之间,进程间通信------>多个执行流看到的同一份资源---->多个资源都会并发访问这个资源(此时易出现…

边缘概率密度、条件概率密度、边缘分布函数、联合分布函数关系

目录 二维随机变量及其分布离散型随机变量连续型随机变量边缘分布边缘概率密度举例边缘概率密度 条件概率密度边缘概率密度与条件概率密度的区别边缘概率密度条件概率密度举个具体例子 参考资料 二维随机变量及其分布 离散型随机变量 把所有的概率&#xff0c;都理解成不同质量…

Python:安装/Mac

之前一直陆陆续续有学python&#xff01;今天开始&#xff01;正式开肝&#xff01;&#xff01;&#xff01; 进入网站&#xff1a;可能会有点慢&#xff0c;多开几个网页 https://www.python.org 点击下载&#xff0c;然后进入新的页面&#xff0c;往下滑 来到File&#xff0…

EEG源定位(EEG Source Localization)

EEG源定位&#xff08;EEG Source Localization&#xff09;是一种用于确定大脑内部电活动来源的方法。通过在头皮上记录的电信号&#xff08;EEG&#xff09;&#xff0c;源定位技术可以推断这些信号的起源&#xff0c;即确定大脑中的哪些区域产生了这些电活动。这对于理解大脑…