[UWP]依赖属性1:概述

来源:互联网 发布:淘宝收藏的店铺在哪里 编辑:程序博客网 时间:2024/05/27 06:52

1. 概述

依赖属性(DependencyProperty)是UWP的核心概念,它是有DependencyObject提供的一种特殊的属性。由于UWP的几乎所有UI元素都是集成于DependencyObject的FramewordElement,并且这些UI元素的几乎所有属性及它们出现在XAML中的几乎所有属性都是依赖属性,所以可以说依赖属性是专门为UI设计的属性系统。
UWP的基本继承关系

依赖属性的定义:

/// <summary>/// 获取或设置Title的值/// </summary>  public string Title{    get { return (string)GetValue(TitleProperty); }    set { SetValue(TitleProperty, value); }}/// <summary>/// 标识 Title 依赖属性。/// </summary>public static readonly DependencyProperty TitleProperty =    DependencyProperty.Register("Title", typeof(string), typeof(MyPage), new PropertyMetadata(string.Empty));

如上述代码所示,和CLR属性不同依赖属性需要定义TitleProperty ,然后在属性包装器(Getter和Setter)中通过GetValue和SetValue函数操作属性值。

2. 使用的场景

UWP的依赖属性经过大幅简化(相对于WPF),更关注它的核心功能:使用绑定,通过多个输入计算属性值,属性值变化通知,节约内存使用。

2.1 绑定

通过属性包装器,依赖属性可以像CLR属性那样使用,也可以在XAML中通过绑定来使用,这是CLR属性不能提供的功能。

在XAML中使用:

<TextBlock x:Name="TextElement"            Text="{Binding Title}" />

在代码中使用:

var binding = new Windows.UI.Xaml.Data.Binding();binding.Path = new PropertyPath("Title");TextElement.SetBinding(TextBlock.TextProperty, binding);

2.2 通过多个输入计算属性值

在UWP中依赖属性通过多个输入源计算属性的值,从而使开发人员就避免了不必要的属性设置值或者处理属性值变更通知。以下列表从优先级由高到低列出了依赖属性的使用顺序。

依赖属性优先级

  • 动画值 正在运行的动画,或具有 HoldEnd 行为的动画。若要进行动画处理,动画的目标属性必须是依赖项属性。
  • 本地值 在代码中直接为对象实例设置的属性值,或者在 XAML 中设置的属性值。

    本地值可以通过调用ClearValue函数清除,从而使属性值还原成默认值(以我的经验来说,很少会用到)。

  • 模板属性 如果在某个模板(来自 ControlTemplate 或 DataTemplate)中创建一个元素,该元素就会拥有这些模板属性。
  • 样式设置器 Style中的Setter。
  • 继承值 元素可以从其在对象树中的父级继承依赖项属性的值。譬如开发人员不必为每个TextBlock设置FontSize,只需要为父容器设置FontSize即可套用到父容器中的所有TextBlock上。
  • 默认值 不是指数据类型的默认值,是指PropertyMetadata中指定的默认值。在上面Title的例子中,默认值是string.Empty。

2.3 属性值变化通知

使用依赖属性,不必再实现INotifyPropertyChanged即可在属性改变时通知UI更新。也可以在PropertyMeta中使用PropertyChangedCallback或DependencyObject.RegisterPropertyChangedCallback监视依赖属性的属性值改变。

2.4 节约内存使用

前面提到,UWP可以不必为所有值都设置值,UI元素的依赖属性可以从样式、继承值、默认值等计算出实际值,并不需要分配内存;如果设置了本地值,这个本地值将存储在HashTable中,之后从这个HashTable中读取。这是一种以时间换空间的做法。
假设一个Control自身及所继承的FrameworkElement等父类型中所有的属性加起来大概50个,它的控件模板中大概有3个FrameworkElement,所有属性都是double类型并且所有都不必要设置值,一个Control就可以节省50 * 3 * 8=1200字节的内存空间。我做过的系统最多同时在UI上放了10W个Control,那么就总共节省了大概100M内存。
这么极端的情况也才节省这点内存,作用好像也没那么大(难道我算错了?)。关于节约内存这点稍微了解下就好,有助于了解依赖属性的原理,并且面试的时候有可能有帮助。

3 依赖属性和CLR属性之间的选择

使用依赖属性的情况

  • 基本上所有继承DependencyObject的类中的属性都应该是依赖属性;
  • 需要使用Binding、Style或动画设置值的属性;
  • 需要监视属性值变化通知;
  • 内存真的真的不够用;

使用CLR属性的情况

  • 集合属性。在UWP中常见的集合属性,只有ItemsControl的ItemsSource等少数几个是依赖属性,其它大部分都是CLR属性,譬如Hub的Sections;
  • CPU性能敏感的场合。依赖属性是用时间换空间的概念,假如需要频繁读写而又不需要绑定,可以考虑使用CLR属性;

4. 依赖属性和线程

所有依赖属性都只能在UI线程上使用,否则会抛异常(“应用程序调用一个已为另一线程整理的接口。”)。不过如果使用Async模式的话通常会回避了线程的问题。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 身份证收据丢了怎么办 违章罚单丢了怎么办 村里的房子怎么办房产证 驾驶员没有从业资格证怎么办 滴滴驾驶员从业资格证怎么办 驾驶员证丢了怎么办 车检过期两个月怎么办 车子一年未年检怎么办 银行年检过期了怎么办 个体工商年报过期怎么办 个体工商执照过期怎么办 决定书编号16位怎么办 挂招牌遇到城管怎么办 结业证书丢了怎么办 违章满12分怎么办 摩托车分扣完了怎么办 驾校故意卡学员怎么办 新疆网上办税怎么办? 科三考4次不过怎么办 科三挂了4次怎么办 征信进入黑名单怎么办 年检换标过期怎么办 滴滴叫不到车怎么办 学时卡丢了怎么办 驾校学员丢了怎么办 考驾照学时不够怎么办 车辆年审超时间怎么办 车辆过年检了怎么办 开公司货车违章怎么办 毕业证丢了怎么办居住证 贴吧回帖被秒删怎么办 群拉人失败了怎么办 安装解释包错误怎么办 皮皮麻将进不去怎么办 郑州集体户口怎么办准生证 广州集体户口准生证怎么办 学校寄档案丢失怎么办 深圳通儿童卡怎么办 集体户没有户口卡怎么办 北京滴滴跑长途怎么办 应届毕业生落户成都档案怎么办