Dependency Property(简称DP)是WPF的核心,Style就是基于Dependency Property的,关于DP的内幕,请参见深入WPF--依赖属性。Style中的Setter就是作用在DP上的,如果你在控件中定义了一个CLR属性,Style是不能设置的。Dependency Property设计的精髓在于把字段的存取和对象(Dependency Object)剥离开,一个属性值内部用多个字段来存储,根据取值条件的优先级来决定当前属性应该取哪个字段。

  Dependency Property取值条件的优先级是(从上到下优先级从低到高):

enum BaseValueSource
   2: {
   3:     Unknown,
   4:     Default,
   5:     Inherited,
   6:     DefaultStyle,
   7:     DefaultStyleTrigger,
   8:     Style,
   9:     TemplateTrigger,
  10:     StyleTrigger,
  11:     ImplicitStyleReference,
  12:     ParentTemplate,
  13:     ParentTemplateTrigger,
  14:     Local
  15: }

  对于一个具体例子来说:

>
>
>
/>
>
>
/>
>
>
>
>
>
/>
>
>

  第4行用Style的Setter设置Width=60,这个优先级是Style;第6行当IsMouseOver为True时设置Width=80,这个优先级是StyleTrigger;第13行使用Style的Button定义Width=20,这个优先级是Local。Local具有最高的优先级,所以即使鼠标移到Button上,第6行的Trigger也会因为优先级不够高而不起作用。如果去掉了第13行中的Width=20,那么鼠标移到Button上时Width会变为80,鼠标移开后会回到第4行的设置的60来。

相关文章: