WPF中Dependency属性设置顺序的心得

今天在学习WPF依赖属性的时候做了一个很经典的例子,即通过XMAL中的Trigger来改变按钮的前景色。具体代码如下:

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<Button>
            OK
            
<Button.Style>
                
<Style TargetType="{x:Type Button}">
                    
<Style.Triggers>
                        
<Trigger Property="IsMouseOver" Value="True">
                            
<Setter Property="Foreground" Value="Blue"></Setter>
                        
</Trigger>
                    
</Style.Triggers>
                
</Style>
            
</Button.Style>
</Button>


 

可以很好的实现,将鼠标移至按钮上,然后按钮的前景色变为蓝色的功能。

但是尝试给此按钮设置一个Foreground属性,代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<Button  Foreground="Black">
            OK
            
<Button.Style>
                
<Style TargetType="{x:Type Button}">
                    
<Style.Triggers>
                        
<Trigger Property="IsMouseOver" Value="True">
                            
<Setter Property="Foreground" Value="Blue"></Setter>
                        
</Trigger>
                    
</Style.Triggers>
                
</Style>
            
</Button.Style>
        
</Button

 

则使Trigger设置前者色的作用失效了。于是这便使我联想到这几天看到的一篇Dependency属性计算顺序的文章

http://www.cnblogs.com/YilingLai/archive/2006/12/25/602889.html

原来在第一步计算基础值的时,系统是按照下面的优先级来计算Dependency属性的值的:

 

 

 1、Local Value                  

2、Style Triggers              

3、Template Triggers                   

4、Style Setters 

5、Theme Style Triggers    

6、Theme Style Setters     

7、Property Value Inheritance      

8、Default Value

因为Foreground="Black"属于Local Value,比Style Triggers的优先级要高,所以在计算过程中

它掩盖了Style Triggers对Foreground属性值的作用。

那么既需要设置Foreground同时也需要通过设置Trigger来改变它怎么做呢?

答案就是如下面代码所示:

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<Window.Resources>
        
<Style TargetType="{x:Type Button}" x:Key="changeColorStyle">
            
<Style.Triggers>
                
<Trigger Property="IsMouseOver" Value="True">
                    
<Setter Property="Foreground" Value="Blue"></Setter>
                
</Trigger>
            
</Style.Triggers>
            
<Setter Property="Foreground" Value="Black"></Setter>
        
</Style>
    
</Window.Resources>
    
<StackPanel>
        
<Button Style="{StaticResource changeColorStyle}">
            OK
        
</Button>
    
</StackPanel

 

将Style提取到Window.Resources中,然后使此Button引用此资源。

因为在计算基础值的顺序时,Style Triggers排在第二,而Style Setter则排在第四的位置上。


 

ContractedBlock.gifCode 

转载于:https://www.cnblogs.com/chinese-zmm/archive/2009/02/10/1387626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值