首页 > 其他分享 >WPF依赖属性和附加属性

WPF依赖属性和附加属性

时间:2025-01-03 17:34:54浏览次数:5  
标签:依赖 封装 定义 附加 GetValue WPF 属性

https://blog.csdn.net/wang__junhappy/article/details/84848780

 

 

依赖属性以及附加属性
依赖属性(DependencyProperty)

1.概念

依赖属性是一种可以自己没有值,并能通过使用Binding从数据源获得值的属性(通俗的讲,就是依赖在别的属性上)。

依赖属性是为了解决普通属性因继承而带来的对象膨胀。

例如Button的继承

Button->ButtonBase->ContentControl->Control->FrameworkElement->UIElement->Visual->DependencyObject->...

所以每次继承,父类的私有字段都会被继承下来。继承树的低端对象不可避免的膨胀。大多数属性并没有被修改,仍然保持着父类定义时的默认值。

定义依赖属性

例:

// 定义依赖属性

public static readonly DependencyProperty NameProperty;

注册依赖属性

必须在于其关联的静态构造函数中注册

添加属性封装器

public string Title

{

get { return (string)GetValue(NameProperty); }

set { SetValue(NameProperty, value); }

}

创建属性封装器时,应当只包含对SetValue()和GetValue()方法的调用,不应当添加任何验证属性值的额外代码、引发事件的代码等。这是因为WPF中的其他功能可能会忽略属性封装器,并直接调用SetValue()和GetValue()方法。

属性封装器不是验证数据或引发事件的正确位置,使用依赖属性回调函数(Dependency-Property.Validate ValueCallback回调函数进行验证操作)

当属性变化时,如果希望进行响应,有两种选择--可以使用属性值创建绑定,也可以编写能够自动改变其他属性或开始动画的触发器。

依赖属性的优点:

优化了属性的存储,减少了不必要的内存使用
加入了属性变化通知,限制,验证等
可以存储多个值,配合人EXpression以及Animation等,打造出更灵活的使用方式

附加属性

1.概念

附加属性是一种依赖属性,不同之处在于附加属性被应用到的类并非定义附加属性的那个类。

附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解耦,让数据类型的设计更加灵活,举例,一个TextBox被放在不同的布局容器中时就会有不同的布局属性,这些属性就是由布局容器为TextBox附加上的,附加属性的本质就是依赖属性,二者仅仅在注册和包装器上有一点区别。

定义附加属性

定义附加属性,需要使用RegisterAttached()方法,而不是使用Register()方法

当创建附加属性时,不必定义.NET属性封装器。这是因为附加属性可以被用于任何对象。例如,Grid。Row属性可能被用于Grid对象,也可能被用于其他元素上。

不使用.NET属性封装器,反而附加属性需要调用两个静态方法来设置和获取属性值,这两个方法使用为人熟知的SetValue()和GetValue()方法,这两个方法应当命名为SetPropertyName()和GetPropertyName()。

附加属性与依赖属性的区别

1.附加属性使用的RegisterAttached方法,而依赖属性使用的是Register方法

2.附加属性使用两个方法进行包装,依赖属性使用CLR属性对GetValue和Set Value两个方法进行包装。

3.附加属性被应用到的类并非定义附加属性的那个类,依赖属性被应用到定义附加属性的那个类。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/wang__junhappy/article/details/84848780

标签:依赖,封装,定义,附加,GetValue,WPF,属性
From: https://www.cnblogs.com/cxxtreasure/p/18650604

相关文章

  • 网安企业不具备科创属性,如何突围?
    行业分析2024年4月,证监会与三大证券交易所分别发布了系列规定,大幅提升了主板、科创板、创业板上市门槛。因科创属性要求的提升,网络安全企业IPO通过创业板最低要求是最近两年净利润均为正,累计净利润不低于1亿元,且最近一年净利润不低于6000万元,此要求换算成营收起码10亿。据2024......
  • 使用 WPF HelixToolkit类库实现多个 SEG-Y 数据文件的三维地震模型渲染
    一、背景在地震勘探和数据可视化中,三维地震数据的渲染对于理解地下结构至关重要。随着地震数据量的增加,如何高效地渲染多个SEG-Y文件,并通过三维模型展现其振幅信息,成为一个值得研究的课题。本文将展示如何利用WPF和HelixToolkit工具包,加载和渲染多个SEG-Y文件,生成三维地......
  • 【WPF踩坑】-后台窗口切换到前台
    引入在开发WPF应用时,你可能会需要把后台窗体切换到前台。就是有A和B两个窗口,用户把B窗口最小化了,但是现在你需要把的B窗口用代码的方式切换到前台,而B窗口放在A窗口后面过去的做法可能你会看到很多文章,告诉你直接像下面一样,执行这段代码即可:window.Activate()但实际上,这行代......
  • 请解译下nodejs中__dirname,__filename属性的作用
    在Node.js中,__dirname和__filename是两个全局变量,它们提供了关于当前执行脚本的目录和文件名的信息。这两个变量在Node.js应用程序中特别有用,尤其是当你需要处理文件路径或构建相对路径时。__dirname:__dirname返回当前执行脚本所在的目录的绝对路径。这是一个字符串......
  • 在Vue中this.$refs获取为undefined的原因和解决办法(this.$refs.属性为undefined原因)
    在Vue中,this.$refs用来访问组件内部或DOM元素上的ref属性所引用的元素或子组件实例。如果你遇到this.$refs获取为undefined的情况,通常是由以下几个原因造成的:原因访问时机不正确:如果你在组件的渲染(或子组件的挂载)完成之前就尝试问this.$refs,就会是undefined。因为此时DO......
  • WPF通过外部资源文件为主页面控件编写样式
    1.增加外部样式文件,添加资源词典(WPF)文件创建公共样式文件GlobalStyles.xaml 编写样式文件,以<style>标记开头,TargetType属性为控件类型,如按钮“Button”,单选按钮“RadioButton”等,x:Key属性自定义命名,控件在引用属性的时候需将Style属性设置为{StaticResourcekey属性}......
  • WPF DevExpress按住鼠标下拉滑动列表功能
    usingSystem;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Threading;usingDevExpress.Xpf.Grid;namespaceClient{publicclassAutoScrollHelper{publicA......
  • WPF System.WIndows.Forms add wpf control
    1.NewSystem.Windows.Formsproject;2.Addreference C:\ProgramFiles\ReferenceAssemblies\Microsoft\Framework\v3.0\WindowsFormsIntegration.dll3.DragElementHostfromToolboxtoWindowsForms  4.AddreferencePresentationCore.dll;AddreferenceP......
  • WPF add System.Windows.Forms.PropertyGrid via WindowsFormsHost
    1.AddreferenceSystem.Windows.Forms.dll;2.Addreference C:\ProgramFiles\ReferenceAssemblies\Microsoft\Framework\v3.0\WindowsFormsIntegration.dll3.//xaml<Windowx:Class="WpfApp131.MainWindow"xmlns="http://schemas.mi......
  • WPF call Windows.Forms.PropertyGrid in xaml
    1.AddreferenceSystem.Windows.Forms;2.Addreference C:\ProgramFiles\ReferenceAssemblies\Microsoft\Framework\v3.0\WindowsFormsIntegration.dll3.<Windowx:Class="WpfApp132.MainWindow"xmlns="http://schemas.microsoft.com......