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"/>

使用:

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

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

相关文章

Java客户端调用SOAP方式的WebService服务实现方式分析

简介 在多系统交互中&#xff0c;有时候需要以Java作为客户端来调用SOAP方式的WebService服务&#xff0c;本文通过分析不同的调用方式&#xff0c;以Demo的形式&#xff0c;帮助读者在生产实践中选择合适的调用方式。 本文JDK环境为JDK17。 结论 推荐使用Axis2或者Jaxws&#…

推出全新的无线通讯模块(1SJ型、2DT-158型、2GT-001型、1YN型、2AE型)助力物联网新发展

相关型号&#xff1a;LBAA0QB1SJ-296 LBAA0XV2DT-158 LBAA0XV2GT-001 LBEE5KL1YN-814 LBEE5PK2AE-564 全新的无线通讯模块&#xff08;1SJ型、2DT-158型、2GT-001型、1YN型、2AE型&#xff09;助力物联网新发展&#xff08;明佳达&#xff09; 1、1SJ型集成LoRaWAN调制解调器…

优劣分析:重启路由器 vs 使用IP代理

目前更换IP主要有两种常见方法&#xff0c;一种是重启路由器&#xff0c;另一种是使用代理IP&#xff0c;那么&#xff0c;这两种方法有什么优缺点呢&#xff1f;下面我们一起来探讨一下。 方法一&#xff1a;重启路由器变换IP 优点 1. 操作简单&#xff1a;只需断开路由器电…

『C + ⒈』‘\‘

&#x1f942;在反斜杠(\)有⒉种最常用的功能如下所示&#x1f44b; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(void) {int a 10;int b 20;int c 30;if (a 10 &&\b 20 &&\c 30){printf("Your print\n");}else{prin…

解锁AI大模型潜能:预训练、迁移学习与中间件编程的协同艺术

在人工智能的浩瀚星空中&#xff0c;大型预训练模型&#xff08;Large Language Models, LLMs&#xff09;犹如璀璨的星辰&#xff0c;引领着技术革新的浪潮。这些模型通过海量数据的滋养&#xff0c;学会了理解语言、生成文本乃至执行复杂任务的能力。然而&#xff0c;要让这些…

可以拖拽的富文本编辑器(VueDragResize,quill-editor)

该功能实现一个帮助文档的展示和编辑功能&#xff0c;默认进去只能查看帮助文档的内容&#xff0c;点击编辑可以进行富文本编辑器的编辑功能。 出现的问题1.如何隐藏富文本编辑的工具栏并且禁止编辑 //隐藏工具栏this.toolbar this.$refs.myTextEditor.quill.getModule(toolb…

LeetCode之无重复字符的最长子串

1.题目链接 3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/ 2.题目解析 题目主要思路其实是滑动窗口&#xff0c;使用两个指针维护一个动态区间&#xff0c;使…

价格疑云?格行WiFi创始人亲解谜团,性价比之王如何炼成?

随身wifi行业乱象频出&#xff0c;作为行业领跑品牌的格行随身wifi&#xff0c;关于价格问题一直备受质疑。关于设备上的“格行自有格行的骄傲”也被外界认定为是自大&#xff0c;甚至发展的线下一万多家门店也被同行不认可。近日&#xff0c;企业财经专访记者有幸采访了格行随…

实时消息推送系统,写得太好了!

websocket 协议是在 http 协议上的一种补充协议&#xff0c;是 html5 的新特性&#xff0c;是一种持久化的协议。其实 websocket 和 http 关系并不是很大&#xff0c;不过都是属于应用层的协议&#xff0c;接下来我们就开始实战。 websocket 定时推送 本教程基于 springboot …

华为od相关信息分享

2024年OD统一考试&#xff08;D卷&#xff09;完整题库&#xff1a;华为OD机试2024年最新题库&#xff08;Python、JAVA、C合集&#xff09; 问 1.什么是华为od&#xff1f; 答&#xff1a;OD全称是Outsourcing Dispacth&#xff0c;即外包派遣&#xff0c;是华为和外企德科…

HTML 标签简写及全称:表格内容将通过JavaScript动态生成

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML 标签简写及全称</title><style>…

2025考研~数据结构试卷

作者主页&#xff1a;知孤云出岫 数据结构试题 [TOC](数据结构试题)数据结构试卷一、选择题&#xff08;每题2分&#xff0c;共20分&#xff09;二、填空题&#xff08;每题3分&#xff0c;共15分&#xff09;三、简答题&#xff08;每题10分&#xff0c;共40分&#xff09;四…

卷技术还是卷应用?李彦宏给出了明确答案

如何理解李彦宏说的“不要卷模型&#xff0c;要卷应用” 引言 7月4日&#xff0c;2024世界人工智能大会在上海世博中心召开。百度创始人兼CEO李彦宏在产业发展主论坛上呼吁&#xff1a;“大家不要卷模型&#xff0c;要卷应用&#xff01;”这句话引起了广泛讨论。李彦宏认为&a…

【python】PyQt5对象类型的判定,对象删除操作详细解读

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

2款一键word生成ppt的AI工具,让职场办公更为简单!

在当下主打异步沟通的职场办公环境中&#xff0c;我们与很多人的沟通&#xff0c;都是通过书面材料来达成的&#xff0c;这就让 Word 或文档编辑软件变得更为重要&#xff0c;与此同时&#xff0c;有时为了凸现书面材料中的重点&#xff0c;我们还要将 word 文档转换为 ppt 来进…

设计模式使用简例(简单工厂+策略模式+模板方法)

直接上代码&#xff0c;方便记忆。主要的要点&#xff0c;已经写到注释中。 一&#xff0c;代码展示 启动类 package com.rojer;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootAppli…

代码随想录算法训练营第四十八天| 115.不同的子序列、583. 两个字符串的删除操作、 72. 编辑距离

115.不同的子序列 题目链接&#xff1a;115.不同的子序列 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会 思路&#xff1a; dp[i][j] 表示在 s 的前 j 个字符中&#xff0c;t 的前 i 个字符作为子序列出现的次数。 匹配的情况&#xff1a; 1.当 s[j-1] 与 t[i-1] 匹配…

TextView 实现最后一行缩进指定距离

实现图上类似的效果。 指定最大行数为三行&#xff0c;最后一行缩进指定的距离。 如果行数小于三行&#xff0c;则不缩进。 同时文字两端对齐 代码里的 JustifyTextView &#xff08;两端对齐的 Textview &#xff09;详见 Android Textview 多行文本两端对齐_android tex…

混合贪心算法求解地铁线路调度

一、问题描述 城市轨道交通的繁荣发展&#xff0c;带来了车辆资源需求的日益增加。如何兼顾运营服务水平和运营成本&#xff0c;以最少的车底优质地完成运输任务成为一大严峻问题。本题在后续的描述中将由多辆动车和拖车组合而成的车组称为车底。在日常的运营组织中&#xff0…

单链表(C语言详细版)

1. 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表的结构跟火车车厢相似&#xff0c;淡季时车次的车厢会相应减少&#xff0c;旺季时车次的车厢会额外增加几节。…