Style 的优先级

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

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

复制代码
public enum BaseValueSource
{
    Unknown,
    Default,
    Inherited,
    DefaultStyle,
    DefaultStyleTrigger,
    Style,
    TemplateTrigger,
    StyleTrigger,
    ImplicitStyleReference,
    ParentTemplate,
    ParentTemplateTrigger,
    Local
 }
复制代码

举一个具体例子来说:

复制代码
<Window>
    <Window.Resources>
        <Style TargetType="{x:Type Button}" x:Key="ButtonStyle">
            <Setter Property="Width" Value="60"/>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Width" Value="80"/>
                    </Trigger>
                </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
    <Button x:Name="button1" Style="{StaticResource ButtonStyle}"         
                 Background="{DynamicResource brush}" Width="20"/>
   </Grid>
</Window>
复制代码

优先级描述:

第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来。

posted @   平常xin  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示