[UWP]看重属性1:概述

1. 概述

依赖属性(DependencyProperty)是UWP的中央概念,它是有DependencyObject提供的一种卓殊的性质。由于UWP的大概所有UI元素都是合二为一于DependencyObject的FramewordElement,并且那么些UI元素的几乎拥有属性及它们出现在XAML中的大致所有属性都是凭借属性,所以可以说看重属性是专程为UI设计的品质系统。
2018正版葡京赌侠诗 1

依靠属性的定义:

/// <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中看重属性通过多个输入源总括属性的值,从而使开发人士就避免了不必要的特性设置值或者处理属性值变更通告。以下列表从优先级由高到低列出了依赖属性的采用各类。

2018正版葡京赌侠诗 2

  • 动画值 正在周转的卡通片,或有所 HoldEnd
    行为的卡通片。若要进行动画处理,动画的对象属性必须是看重项属性。
  • 本地值 在代码中直接为对象实例设置的属性值,或者在 XAML
    中设置的属性值。

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

  • 模板属性 借使在某个模板(来自 ControlTemplate 或
    DataTemplate)中创建一个因素,该因素就会持有那么些模板属性。

  • 体制设置器 Style中的Setter。
  • 继承值
    元素可以从其在目的树中的父级继承着重项属性的值。譬如开发人士不必为各样TextBlock设置FontSize,只必要为父容器设置FontSize即可套用到父容器中的所有TextBlock上。
  • 默认值
    不是指数据类型的默许值,是指PropertyMetadata中指定的默许值。在上头Title的例子中,默许值是string.Empty。

2018正版葡京赌侠诗,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情势的话日常会避开了线程的难点。

相关文章