本文共 2364 字,大约阅读时间需要 7 分钟。
依赖属性(DependencyProperty)是UWP的核心概念,它是有DependencyObject提供的一种特殊的属性。由于UWP的几乎所有UI元素都是集成于DependencyObject的FramewordElement,并且这些UI元素的几乎所有属性及它们出现在XAML中的几乎所有属性都是依赖属性,所以可以说依赖属性是专门为UI设计的属性系统。
依赖属性的定义:
////// 获取或设置Title的值/// public string Title{ get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); }}////// 标识 Title 依赖属性。/// public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(MyPage), new PropertyMetadata(string.Empty));
如上述代码所示,和CLR属性不同依赖属性需要定义TitleProperty ,然后在属性包装器(Getter和Setter)中通过GetValue和SetValue函数操作属性值。
UWP的依赖属性经过大幅简化(相对于WPF),更关注它的核心功能:使用绑定,通过多个输入计算属性值,属性值变化通知,节约内存使用。
通过属性包装器,依赖属性可以像CLR属性那样使用,也可以在XAML中通过绑定来使用,这是CLR属性不能提供的功能。
在XAML中使用:
在代码中使用:
var binding = new Windows.UI.Xaml.Data.Binding();binding.Path = new PropertyPath("Title");TextElement.SetBinding(TextBlock.TextProperty, binding);
在UWP中依赖属性通过多个输入源计算属性的值,从而使开发人员就避免了不必要的属性设置值或者处理属性值变更通知。以下列表从优先级由高到低列出了依赖属性的使用顺序。
本地值可以通过调用ClearValue函数清除,从而使属性值还原成默认值(以我的经验来说,很少会用到)。
使用依赖属性,不必再实现INotifyPropertyChanged即可在属性改变时通知UI更新。也可以在PropertyMeta中使用PropertyChangedCallback或DependencyObject.RegisterPropertyChangedCallback监视依赖属性的属性值改变。
前面提到,UWP可以不必为所有值都设置值,UI元素的依赖属性可以从样式、继承值、默认值等计算出实际值,并不需要分配内存;如果设置了本地值,这个本地值将存储在HashTable中,之后从这个HashTable中读取。这是一种以时间换空间的做法。
假设一个Control自身及所继承的FrameworkElement等父类型中所有的属性加起来大概50个,它的控件模板中大概有3个FrameworkElement,所有属性都是double类型并且所有都不必要设置值,一个Control就可以节省50 * 3 * 8=1200字节的内存空间。我做过的系统最多同时在UI上放了10W个Control,那么就总共节省了大概100M内存。这么极端的情况也才节省这点内存,作用好像也没那么大(难道我算错了?)。关于节约内存这点稍微了解下就好,有助于了解依赖属性的原理,并且面试的时候有可能有帮助。使用依赖属性的情况
使用CLR属性的情况
所有依赖属性都只能在UI线程上使用,否则会抛异常(“应用程序调用一个已为另一线程整理的接口。”)。不过如果使用Async模式的话通常会回避了线程的问题。
转载地址:http://siyuz.baihongyu.com/