WPF依赖属性的当前值(Current Value),基值(Base Value)和本地值(Local Value) .

来源:互联网 发布:网络摄像头 监控软件 编辑:程序博客网 时间:2024/05/02 00:46

依赖属性的当前值(Current Value),基值(Base Value)和本地值(Local Value)是MSDN常出现的三个词,这些属性和依赖属性的优先级设置有关。

如下表:

  这里是当前值

1.  1. 属性系统强制转换,这里是通过依赖属性的CoerceValueCallback

2.  2. 活动动画或者具有Hold行为的动画

  这里是基值

3.  3. 本地值,通过依赖属性的SetValue方法,资源,绑定

4.  4. 其他方式如样式,触发器等……

这里列出一部分以依赖属性值优先级的情况,完整列表请参考MSDN:http://msdn.microsoft.com/zh-cn/library/ms743230.aspx

当前值

是最外层的属性值,可能经过一些列的处理或影响而得到的最终值。

基值

当依赖属性没有经过系统强制转换,没有经过动画处理影响的值,就是上表中在第三项之上,但没有被一和二项所影响的值。

本地值

这个是比较直观设置的值,是通过依赖属性SetValue方法或者资源或绑定设置的值。

那么如何得到这些值呢?

当前值:通过依赖属性的GetValue方法

基值:通过IAnimatable接口的GetAnimationBaseValue方法

本地值:通过依赖属性的ReadLocalValue方法,如果没有本地值则返回DependencyProperty.UnsetValue字段

假设有两个按钮,名称分别是btn1和btn2,程序运行后,按钮的宽度(Width依赖属性)都会被DoubleAnimation动画从50变为100,两个按钮的唯一区别是btn1的Width是直接设置的。btn2的Width是通过样式的Setter设置的。

那么当动画结束后,两个按钮的Width依赖属性的具体值是这样的:

btn1

btn2

当前值

100

100

基值

50

50

本地值

50

DependencyProperty.UnsetValue

由于动画设置了依赖属性,所以当前值是100.

而在动画前,Width都是50,所以基值都是50

而btn1直接设置了Width,就是调用了依赖属性的SetValue,所以本地值被设置。

而btn2通过样式的Setter设置Width,属于上表中的第四项,本地值没有被设置。

通过程序可以实际测试一下:

获取属性的代码参考:

 

[csharp] view plaincopyprint?
  1. object[] GetValues(object obj, DependencyProperty pro)  
  2.    
  3.         {  
  4.    
  5.             if (obj is DependencyObject == false || obj is IAnimatable == false)  
  6.    
  7.                 throw new ArgumentException();  
  8.    
  9.             object[] re = new object[3];  
  10.    
  11.    
  12.    
  13.             var dobj = (DependencyObject)obj;  
  14.    
  15.             var ianm = (IAnimatable)obj;  
  16.    
  17.    
  18.    
  19.             re[0] = dobj.GetValue(pro);  
  20.    
  21.             re[1] = ianm.GetAnimationBaseValue(pro);  
  22.    
  23.             re[2] = dobj.ReadLocalValue(pro);  
  24.    
  25.             return re;  
  26.    
  27.    
  28.    
  29.         }  
  30.    
  31.    
  32.    
  33.         string GetValuesString(object obj, DependencyProperty pro,string name)  
  34.    
  35.         {  
  36.    
  37.             var objs = GetValues(obj, pro);  
  38.    
  39.             return String.Format("{3}\n当前值:{0}\n基值:{1}\n本地值:{2}\n\n",  
  40.    
  41.                 objs[0], objs[1], objs[2], name);  
  42.    
  43.         }  


两个按钮XAML动画定义:

[plain] view plaincopyprint?
  1. <Button Width="50" Height="30" Name="btn1" Content="1" >  
  2.    
  3.             <Button.Triggers>  
  4.    
  5.                 <EventTrigger RoutedEvent="Button.Loaded">  
  6.    
  7.                     <EventTrigger.Actions>  
  8.    
  9.                         <BeginStoryboard>  
  10.    
  11.                             <Storyboard>  
  12.    
  13.                                 <DoubleAnimation Storyboard.TargetProperty="Width"   
  14.   
  15.                                                  To="100" Duration="0:0:0.5"/>  
  16.    
  17.                             </Storyboard>  
  18.    
  19.                         </BeginStoryboard>  
  20.    
  21.                     </EventTrigger.Actions>  
  22.    
  23.                 </EventTrigger>  
  24.    
  25.             </Button.Triggers>  
  26.    
  27.         </Button>  
  28.    
  29.    
  30.    
  31.         <Button Height="30" Name="btn2" Content="2" >  
  32.    
  33.             <Button.Style>  
  34.    
  35.                 <Style TargetType="Button">  
  36.    
  37.                     <Setter Property="Width" Value="50"/>  
  38.    
  39.                 </Style>  
  40.    
  41.             </Button.Style>  
  42.    
  43.             <Button.Triggers>  
  44.    
  45.                 <EventTrigger RoutedEvent="Button.Loaded">  
  46.    
  47.                     <EventTrigger.Actions>  
  48.    
  49.                         <BeginStoryboard>  
  50.    
  51.                             <Storyboard>  
  52.    
  53.                                 <DoubleAnimation Storyboard.TargetProperty="Width"   
  54.   
  55.                                                  To="100" Duration="0:0:0.5"/>  
  56.    
  57.                             </Storyboard>  
  58.    
  59.                         </BeginStoryboard>  
  60.    
  61.                     </EventTrigger.Actions>  
  62.    
  63.                 </EventTrigger>  
  64.    
  65.             </Button.Triggers>  
  66.    
  67.         </Button>  
0 0
原创粉丝点击