1. 概述

据属性(DependencyProperty)是UWP的主干概念,它是发出DependencyObject提供的同样种植特别的性质。由于UWP的几所有UI元素都是合二为一为DependencyObject的FramewordElement,并且这些UI元素的几乎有属性与她出现于XAML中的几乎拥有属性都是负属性,所以可以说凭属性是特意为UI设计的习性系统。
图片 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中依赖属性通过多只输入源计算属性的值,从而使开发人员就避免了未必要之性能设置值或者处理属性值变更通知。以下列表从优先级由高到低列出了因属性之动各个。

图片 2

  • 动画值 正在运转的卡通,或有所 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属性;

  • 拄属性和线程

负有乘属性都只能以UI线程上用,否则会丢掉大(“应用程序调用一个就也任何一样线程整理的接口。”)。不过如果运用Async模式之说话通常会避开了线程的题材。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图