通知公告
属性优先级(MPF实例教程第十一课)
日期:2015-12-17  发布人:admin  浏览量:447

  这一课重点介绍下MPF中的属性,和传统的界面引擎不一样,MPF有自己的属性系统,而且MPF中的属性是class级别的,而不是实例级别的,举个例子:
  如果Element有20个属性,而Button继承自Element,有30个属性,现在我们new出20个Button的实例,对于传统的界面引擎,会有(20 + 30)*20=1000个属性实例,而对于
MPF来说仅仅有50个属性实例而已,这就是上面我们说的MPF中的属性class级别的,那么问题来了,每个Button实例怎么样拥有属于自己的私有实例呢,答案就是调用Button的SetValue设置属于特定Button实例的属性,显而易见,很多属性我们实际中是用不到的,因此,相对于传统界面引擎,MPF更节约内存。
  上面说了点题外话,现在我们看下
MPF中的属性来自那些地方,总结如下:
  动画值(Animation):动画过程中设置的值;
  调用SetValue设置(Local):直接调用SetValue或在布局文件中在元素节点设置的属性;
  模版触发器属性列表(TemplateTrigger):ControlTemplate.Triggers中设置的属性;
  模版中控件元素属性(Template):模版中的控件元素调用SetValue设置的属性;
  Style触发器属性列表(StyleTrigger):Style.Triggers中设置的属性;
  Style属性列表(Style):Style中属性列表设置的属性;
  上面的属性值从上到下优先级依次从大到小,如果优先级高的设置了属性值,那么优先级低再设置属性值时由于优先级不够就会设置失败。
  下面我们说下这六个属性值的设置:
1)Animation(动画值)
  动画值,在动画运行过程中由系统自动设置,优先级最高。
2)Local(本地值)
  由SetValue设置,或者在布局文件中设置:<Window Width="281" … />,其中的281也是Local值,注意此控件元素不在模版中。
3)TemplateTrigger(模版触发器)
  模版触发器中属性值:
<ControlTemplate.Triggers>
   <Trigger ….>
      <Setter Property="Width" Value="281" />
   </Trigger>
</ControlTemplate.Triggers>
  上面的Width属性值就是在模版触发器设置,属性来源属于TemplateTrigger。
4)Template(模版本地值)
  这类型的属性设置和Local一样,只不过其来源与模版中的控件元素。
5)StyleTrigger(样式触发器)
  属性值由样式触发器中的属性设置,这类属性值用的最多,常常用来根据属性变化动态改变控件元素的外观。
<Style.Triggers>
   <Trigger ….>
      <Setter Property="Width" Value="281" />
   </Trigger>
</Style.Triggers>
6)Style(样式) 
  这类属性值直接由样式中的属性设置,优先级最低,如果需要属性动态变化,那么最好把需要动态变化的属性通过样式属性来设置,这样,其它触发器就会有机会动态修改控件的属性从而改变控件元素的外观。
<Style.Triggers>
   <Setter Property="Width" Value="281" />
</Style.Triggers>
  上面的Width值属于样式属性。

  这一课我们学习了MPF中属性的优先级,以及每种优先级的属性来源,这样我们在属性控件样式时就会知道属性该采用什么方式设置,通常,一般不需要动态变化的属性我们采用Local设置(调用控件元素的SetValue方法设置),需要动态变化就放到样式(Style)中进行设置。
  通过本课的学习,大家可以练习下,改变下属性的设置来源,实际看看效果变化。