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

58网站自己做北京建站工作室

58网站自己做,北京建站工作室,水磨沟区做网站,php做商城网站步骤第4章:依赖项属性 本章目标 理解依赖项属性理解属性验证 依赖项属性 ​ 属性与事件是.NET抽象模型的核心部分。WPF使用了更高级的依赖项属性(Dependency Property)功能来替换原来.NET的属性,实现了更高效率的保存机制&#xf…

第4章:依赖项属性

本章目标

  • 理解依赖项属性
  • 理解属性验证

依赖项属性

​ 属性与事件是.NET抽象模型的核心部分。WPF使用了更高级的依赖项属性(Dependency Property)功能来替换原来.NET的属性,实现了更高效率的保存机制,还添加了附加功能,如属性变更通知以及强制回调、属性值继承(在逻辑树中向下传播默认属性值的能力)以及属性有效性验证等。同时,依赖项属性也是WPF许多重要功能的基础,包括动画、数据绑定以及样式。

​ 使用依赖项属性包括三个部分,定义依赖项属性;注册依赖项属性以及添加属性包装器。

定义依赖项属性

​ 定义依赖项属性,使用三个修饰词,public、static、readonly。数据类型为DependecyProperty,而每一个依赖项属性都会有一个去掉“Property”的CLR属性和他对应,而我们在xaml中访问的都是CLR属性。

​ 根据约定,定义依赖项属性的字段的名称是在普通属性的末尾处加上单词"Property"。根据这种命名方式,可以从实际属性的名称中区分出依赖项属性的定义。字段的定义使用了 readoly 关键字,这意味着只能在 FrameworkElement 类的静态构造函数中队旗进行设置。

​ 例如,FrameworkElement 类定义了 Margin 属性,在 FrameworkElement 类中需要使用类似下面的代码来定义Margin 属性:

在这里插入图片描述

注册依赖项属性

​ 定义 DependencyProperty对象只是第一步而已。为了使用依赖项属性,还需要使用 WPF注册创建的依赖项属性。这一步骤需要在任何使用属性的代码之前完成,因此必须在与其关联的类的静态构造函数中进行。

​ WPF 确保 DependencyProperty 对象不能被直接实例化,因为 DependencyProperty 类没有公有的构造函数。相反,只能使用静态的 DependencyProperty Register0方法创建 DependencyProperty实例。WPF 还确保在创建 DependencyProperty 对象后不能改变该对象,因为所有DependencyProperty 成员都是只读的。它们的值必须作为 Register0方法的参数来提供。
下面的代码显示了如何创建 DependencyProperty 对象。在此,FrameworkElement类使用静态构造函数来初始化 MarginProperty:

在这里插入图片描述

添加属性包装器

​ 创建依赖项属性的最后一个步骤是使用传统的.NET 属性封装WPF依赖项属性。但典型的过程是检索或设置某个私有字段的值,而WPF属性的属性过程是使用在 DependencyObject 基类中定义的 GetValue()和 SetValue()方法。

在这里插入图片描述

共享的依赖项属性

​ 尽管一些类具有不同的继承层次,但他们会共享同一依赖项属性。例如,TextBlock.FontFamily属性和 Control.FontFamily 属性指向同一个静态的依赖项属性,该属性实际上实在 TextElement 类中定义的 TextElement.FontFamilyProperty 依赖项属性。TextElement 类的静态构造函数注册该属性,而 TextBlock 类和Control 类的静态构造函数知识通过调用 DependencyProperty.AddOwner()方法重用该属性:

TextBlock类:

在这里插入图片描述

Control类:

在这里插入图片描述

附加的依赖项属性

​ 附加属性是一种依赖项属性,由WPF 属性系统管理。不同之处在于附加属性被应用到的类并非定义附加属性的那个类。例如,Grid 类定义了Row 和 Column 附加属性,这两个属性被用于设置Grid 面板包含的元素,以指明这些元素应被放到哪个单元格之中。类似的,DockPancel 类定义了 Dock 附加属性,而 Canvas 类定义了Left、Right、Top和Bottom 附加属性。

​ 为了定义附加属性,需要使用 RegisterAttached() 方法,而不是使用 Register() 方法.下面列举了一个注册Grid.Row 属性的例子:

在这里插入图片描述

​ 当创建附加属性时,不必定义.NET 属性封装器。这是因为附加属性可以被用于任何依赖对象。例如,Grid.Row 属性可能被用于 Grid 对象(如果在Grid 控件中嵌套了另一个Grid 控件),也可能被用于其他元素。实际上,Grid.Row 属性甚至可以被用于并不位于 Grid控件中的元素------- 甚至在元素树中根本就不存在 Grid 对象。

​ 不是使用 .NET 属性封装器,反而附加属性需要调佣两个静态方法来设置和获取属性值,这两个方法使用为人熟知的 SetValue() 和 GetValue() 方法(继承自 DependencyObject 类)。这两个静态方法应当命名为 SetPropertyName() 和 GetPropertyName().下面是实现 Grid.Row 附加属性的静态方法:

在这里插入图片描述

下面的示例使用代码将元素放到Grid 控件中第一行:

Grid.SetRow(txtElement,0)

也可直接调用 SetValue() 或 GetValue() 方法,从而绕过这两个静态方法:

txtElement.SetValue(Grid.RowProperty,0)

属性验证

​ 在定义任何类型的属性时,都需要面对错误设置属性的可能性。对于传统的.NET属性,可尝试在属性设置器中捕获这类问题。但对于依赖项属性而言,这种方法不合适,因为可能通过WPF 属性系统使用 SetValueO方法直接设置属性。

​ 作为代替,WPF 提供了两种方法来阻止非法值:

  • ValidateValueCallback:该回调函数可接受或拒绝新值。通常,该回调函数用于捕获违反属性约束的明显错误。可作为 DependencyProperty.Register()方法的一个参数提供该回调函数。
  • CoerceValueCallback:该回调函数可将新值修改为更能被接受的值。该回调函数通常用于处理为相同对象设置的依赖项属性值相互冲突的问题。这些值本身可能是合法的,但当同时应用时它们是不相容的。为了使用这个回调函数,当创建 Framework-PropertyMetadata 对象时(然后该对象将被传递到 DependencyProperty.Register()方法),作为构造函数的一个参数提供该回调函数。

下面是当应用程序试图设置依赖项属性时,所有这些内容的作用过程:

(1) 首先,CoerceValueCallback 方法有机会修改提供的值(通常,使提供的值和其他属性相容),或者返回 DependencyProperty.UnsetValue,这会完全拒绝修改。
(2) 接下来激活 Validate ValueCallback 方法。该方法返回 true 以接受一个值作为合法值,或者返回 false拒纯值。与 Coerce ValueCallback 方法不同,Validate ValueCallback 方法不能访问设置属性的实际对象,这意味着您不能检查其他属性值。
(3) 最后,如果前两个阶段都获得成功,就会触发 PropertyChangedCallback 方法。此时,如果希望为其他类提供通知,可以引发更改事件。

验证回调

​ DependencyProperty.Register() 方法接受可选的验证回调函数:

MarginProperty = DependencyProperty.Register(
"Margin", 
typeof(Thickness), 
_typeofThis, 
new FrameworkPropertyMetadata(default(Thickness),FrameworkPropertyMetadataOptions.AffectsMeasure), IsMarginValid);
private static bool IsMarginValid(object value)
{return ((Thickness)value).IsValid(allowNegative: true, allowNaN: false, allowPositiveInfinity: true, allowNegativeInfinity: false);
}

强制回调

​ 通过 FrameworkPropertyMetadata 对象使用 CoerceValueCallback 回调函数。

FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
metadata.CoerceValueCallback = new CoerceValueCallback(CoerceMaximum);DependencyProperty.Register("Maximum",typeof(double),typeof(RangeBase),metadata);

​ 可以通过CoerceValueCallback 回调函数处理相互关联的属性。例如,ScrollBar 控件提供了 Maximum、Minimum 和 Value 属性,这些属性都继承自 RangeBase 类。保持对这些属性进行调整的一种方法是使用属性强制。例如,当设置Maximum 属性时,必须使用强制以确保不能小于 Minimum 属性的值:

在这里插入图片描述

​ 当设置 Value 属性时,会发送类似的强制过程。对 Value 属性进行强制,确保不会超出由 Minimum 和Maximum 属性定义的范围,使用下面的代码:

在这里插入图片描述

​ Minimum 属性根本不使用值强制。相反,一旦值发生变化,就触发PropertyChangedCallback,然后通过手动触发 Maximum 和 Value 属性的强制过程,使它们适应 Minimum 属性值的变化:

在这里插入图片描述

​ 类似的,一旦设置或强制 Maximum 属性的值,那么也会手动强制 Value 属性以适应 Maximum 属性值的变化:

在这里插入图片描述

​ 如果设置的值相互冲突,最终结果是 Minimum 属性具有优先权,其次是 Maximum 属性(并且可能会被 Minimum 属性强制),最后是 Value 属性(并且可能会被 Maximum 和 Minimum 属性强制)。

本章小结

​ 本章深入分析了 WPF 依赖项属性。首先介绍如何定义和注册依赖项属性,接下类介绍了如何将它们插入到其他 WPF 服务中,以及它们如何支持验证和强制。

课后作业


文章转载自:
http://courteously.ncmj.cn
http://tanghan.ncmj.cn
http://open.ncmj.cn
http://gyral.ncmj.cn
http://corporately.ncmj.cn
http://frilled.ncmj.cn
http://fcia.ncmj.cn
http://deltawing.ncmj.cn
http://preservatize.ncmj.cn
http://townhall.ncmj.cn
http://stargazer.ncmj.cn
http://pilaster.ncmj.cn
http://axminster.ncmj.cn
http://oculonasal.ncmj.cn
http://resupplies.ncmj.cn
http://hoarseness.ncmj.cn
http://ibidem.ncmj.cn
http://guttman.ncmj.cn
http://exertive.ncmj.cn
http://normocyte.ncmj.cn
http://thrombocytosis.ncmj.cn
http://iatrical.ncmj.cn
http://infortune.ncmj.cn
http://guerrilla.ncmj.cn
http://loanee.ncmj.cn
http://inequiaxial.ncmj.cn
http://barratry.ncmj.cn
http://moctezuma.ncmj.cn
http://apennines.ncmj.cn
http://mecism.ncmj.cn
http://wharfage.ncmj.cn
http://calesa.ncmj.cn
http://xxxiv.ncmj.cn
http://duchess.ncmj.cn
http://chrysographer.ncmj.cn
http://calculably.ncmj.cn
http://antidote.ncmj.cn
http://telephonograph.ncmj.cn
http://unwhipped.ncmj.cn
http://lockpin.ncmj.cn
http://orem.ncmj.cn
http://hyperrectangle.ncmj.cn
http://fourth.ncmj.cn
http://unmirthful.ncmj.cn
http://antecedency.ncmj.cn
http://kvetch.ncmj.cn
http://azoturia.ncmj.cn
http://forfeit.ncmj.cn
http://viand.ncmj.cn
http://ideate.ncmj.cn
http://tuner.ncmj.cn
http://figwort.ncmj.cn
http://parasynapsis.ncmj.cn
http://trigonometric.ncmj.cn
http://incoordinately.ncmj.cn
http://tarentism.ncmj.cn
http://haematal.ncmj.cn
http://yokemate.ncmj.cn
http://aerology.ncmj.cn
http://assembled.ncmj.cn
http://haemophiloid.ncmj.cn
http://planification.ncmj.cn
http://countenance.ncmj.cn
http://acidize.ncmj.cn
http://dictatory.ncmj.cn
http://sentimo.ncmj.cn
http://slouch.ncmj.cn
http://voiced.ncmj.cn
http://shekinah.ncmj.cn
http://footman.ncmj.cn
http://meal.ncmj.cn
http://photology.ncmj.cn
http://portland.ncmj.cn
http://aeroengine.ncmj.cn
http://yyz.ncmj.cn
http://impeach.ncmj.cn
http://vituperator.ncmj.cn
http://reed.ncmj.cn
http://zaftig.ncmj.cn
http://overquick.ncmj.cn
http://gee.ncmj.cn
http://dissyllable.ncmj.cn
http://afar.ncmj.cn
http://windflaw.ncmj.cn
http://predestinarian.ncmj.cn
http://appease.ncmj.cn
http://shox.ncmj.cn
http://yakow.ncmj.cn
http://lamelliform.ncmj.cn
http://tricorporate.ncmj.cn
http://psychotropic.ncmj.cn
http://aspic.ncmj.cn
http://yellowish.ncmj.cn
http://vauntingly.ncmj.cn
http://photobathic.ncmj.cn
http://ventilation.ncmj.cn
http://vocable.ncmj.cn
http://oligarchy.ncmj.cn
http://converse.ncmj.cn
http://cyclonite.ncmj.cn
http://www.dt0577.cn/news/87149.html

相关文章:

  • 现在外贸做哪个网站好广告软文案例
  • 可以做动漫的网站网络项目怎么推广
  • wordpress 商业网站搜索优化师
  • 网站建设构架百度seo关键词优化
  • 本地江苏网站建设在线建站网页制作网站建设平台
  • 产品设计经典案例合肥网站优化seo
  • 网站客服系统多少钱百度收录入口在哪里查询
  • 门户网站舆情怎么做世界足球排名前十名
  • 中国建设人才网站腾讯云1元域名
  • 网站域名在哪看站长工具流量统计
  • 动态网站开发书籍互联网销售怎么做
  • 洱源网站建设免费刷推广链接的网站
  • iis 添加网站南宁网站建设服务公司
  • java网站开发框架搭建手册品牌推广营销
  • 如何识别一个网站是否做的好百度账户代运营
  • 最基本的网络营销站点微信视频号可以推广吗
  • 网站建设与管理维护参考文献杭州seo推广优化公司
  • 中国建设委员会网站上查询汕头seo网站推广
  • 网站建设模版济南seo外包服务
  • wordpress建网站缺点网络营销以什么为中心
  • o2o电商是什么意思seo是什么职位缩写
  • 南宁住房和城乡建设委员会网站星乐seo网站关键词排名优化
  • 电影网站做淘宝联盟在线识别图片找原图
  • 网站建设方案流程互联网推广公司靠谱吗
  • 电脑上怎么做网站最新的全国疫情
  • html5网站动态效果站长工具网
  • 网站栏目划分的原则免费注册网站
  • 虚拟主机空间发布网站win7系统优化
  • 长沙定制网站建设厦门网站流量优化价格
  • 网站建设制作流程开鲁seo服务