当前位置: 首页 > news >正文

依赖属性附加属性

依赖属性:

          之前研究的都是Binding的Source和Path,现在研究一下目标Target,依赖属性。

      C#语言规定:对类有意义的字段和方法,使用static关键字修饰为静态成员,对类的实例有意义的字段和方法不加static关键字。静态字段在内存中只有一个拷贝,非静态字段则是每个实例拥有一个拷贝。

       属性的由来:为了保证类中字段的安全性,增加了访问和设置两个方法,后又提出来依赖属性:一种可以自己没有值,通过使用Binding从数据源获得值(依赖在别人身上)的属性,拥有依赖属性的对象称为依赖对象。

       有一个例子,让我们来更深入的理解依赖属性,TextBox有138个属性,每个CLR属性都包装了一个4字节的字段,如果程序运行时创建了10列1000行的一个TextBox列表,那么这些字段将占用4*138*10*1000≈5.26MB内存,所以想了一个实际一点的办法,用得着就带上,用不着就不带,有必要的时候就借用一下别人的,这种实时获取数据的能力依靠依赖属性来实现。

WPF控件所有的UI控件都是依赖对象,绝大多数属性都已经依赖化了。

依赖属性的声明:

附加属性:

一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性,称为附加属性。

下面是附加属性的一个简单举例: 

using System.Windows;public static class MyAttachedProperties
{// 1. 注册附加属性public static readonly DependencyProperty IsHighlightedProperty =DependencyProperty.RegisterAttached("IsHighlighted", // 属性名typeof(bool),    // 属性类型typeof(MyAttachedProperties), // 所属类new PropertyMetadata(false) // 默认值);// 2. 提供静态的 Get 方法public static bool GetIsHighlighted(DependencyObject obj){return (bool)obj.GetValue(IsHighlightedProperty);}// 3. 提供静态的 Set 方法public static void SetIsHighlighted(DependencyObject obj, bool value){obj.SetValue(IsHighlightedProperty, value);}
}
<Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp"Title="MainWindow" Height="350" Width="525"><StackPanel><!-- 使用附加属性 --><Button Content="Click Me" local:MyAttachedProperties.IsHighlighted="True"/></StackPanel>
</Window>
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();// 获取附加属性的值bool isHighlighted = MyAttachedProperties.GetIsHighlighted(myButton);// 设置附加属性的值MyAttachedProperties.SetIsHighlighted(myButton, true);}
}

 附加属性是依赖属性的一种特殊形式,允许一个类将属性附加到其他类的实例上。通过 DependencyProperty.RegisterAttached 注册,并提供静态的 GetSet 方法来访问和修改附加属性的值。附加属性在布局控制和行为扩展方面非常有用,是WPF和UWP开发中的重要工具。

http://www.lryc.cn/news/579374.html

相关文章:

  • 从混沌到澄明,AI如何重构我们的决策地图与未来图景
  • CSS `@scope` 实战指南:开启局部样式隔离新时代
  • NVIDIA Spectrum-3 SN4000 系列SN4000 SN4000 系列速度高达 400Gb/秒的现代横向扩展分布式数据中心应用提供支持。
  • React 学习(3)
  • http、SSL、TLS、https、证书
  • KMP(Kotlin Multiplatform)改造(Android/iOS)老项目
  • java8 Collectors.mapping 使用 例子 学习
  • 学习开发之数组和集合的相似与不同
  • Boss:玩家摄像机系统
  • Python干涉仿真
  • 快速搭建大模型web对话环境指南(open-webUI)
  • 12. grafana-Dashboard的Variable(过滤)使用
  • vbox 虚拟共享文件夹 创建以及权限问题
  • 多模态AI Agent技术栈解析:视觉-语言-决策融合的算法原理与实践
  • [特殊字符] 从图片自动生成 Excel:Python 批量 OCR 表格识别实战
  • 高压电缆护层安全的智能防线:TLKS-PLGD 监控设备深度解析
  • Redis 消息的发布和订阅
  • C++11 shared_ptr 原理与详细教程
  • 算法分析的系统性总结
  • FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
  • Python 物联网(IoT)与边缘计算开发实战(1)
  • 基于多线程实现链表快排
  • 如何有效的开展接口自动化测试?
  • Linux之Socket 编程 UDP
  • C++ 项目实践:如何用对象池优化内存管理、解决 MISRA 报警
  • 制作一款打飞机游戏76:分数显示
  • CentOS系统高效部署fastGPT全攻略
  • Android音视频探索之旅 | CMake基础语法 创建支持Ffmpeg的Android项目
  • 电脑CPU使用率占用100%怎么办 解决步骤指南
  • 按键精灵 安卓脚本开发:游戏实战之自动切换账号辅助工具