Avalon学习笔记(二)——从属属性 和 附加属性

在Avalon设计模型中引入了两个新的概念——从属属性(Dependency Properties)和附加属性(Attached Property)通过它们,我们可以实现风格化(Styling),数据绑定,默认值,动态属性(animation)等等一系列非常酷的功能。

一个动态属性(animation)的例子:
Rectangle拥有一个从属属性“Opacity”,例子中使用DoubleAnimation实现Rectangle的淡入淡出效果。
None.gif < Page   xmlns ="http://schemas.microsoft.com/winfx/avalon/2005"   xmlns:x ="http://schemas.microsoft.com/winfx/xaml/2005" >
None.gif  
< StackPanel  Margin ="30" >
None.gif    
<!--  The rectangle to animate.  -->
None.gif    
< Rectangle  Name ="myAnimatedRectangle"
None.gif      Width
="100"  Height ="100"
None.gif      Fill
="Blue"   />
None.gif  
</ StackPanel >
None.gif  
None.gif  
< Page .Storyboards >
None.gif    
<!--  Animates the opacity of the rectangle from 1.0 to 0.0 over five seconds.  -->
None.gif    
< SetterTimeline  TargetName ="myAnimatedRectangle"  Path ="(Rectangle.Opacity)" >
None.gif      
< DoubleAnimation  From ="1.0"  To ="0.0"  Duration ="0:0:5"  AutoReverse ="True"  RepeatBehavior ="Forever"   />
None.gif    
</ SetterTimeline >
None.gif  
</ Page.Storyboards >
None.gif
</ Page >
None.gif

可以直接将上面的例子复制到XAMLPad看效果。

从属属性

声明一个从属属性需要先为类型定义一个属性,然后使用如下的语法注册这个从属属性。
None.gif public   static   readonly  DependencyProperty CounterProperty  =  
None.gifDependencyProperty.Register(
None.gif  
" PropertyName " ,   //  属性名
None.gif
   typeof ( int ),      //  属性的类型
None.gif
   typeof (MyButtonSimple),   //  属性所在的类型
None.gif
   new  PropertyMetadata( 0 )   //  属性的默认值
None.gif
);
None.gif

注册后,就可以使用XAML来访问这些属性了。于是,就可以使用Style或者Trigger来修改这些属性或者进行数据绑定了。

附加属性
附加属性看起来有点像.NET下的ToolTip组件的实现方式,只是提供了XAML的支持。所谓的附加属性,就是实现在另外一个类型中的属性。

例如:我们可以利用下面的代码将我们自定义的一个附加属性添加到系统类上而不需要建立一个新的继承层次。
None.gif < Button  Name ="mybtn3"  custom:CustomAttachedPropertyClass.TheProperty ="3"   />

所需要的,就是使用如下的代码声明一个附加属性类型。
None.gif public   class  CustomAttachedPropertyClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public static readonly DependencyProperty ThePropertyProperty =
InBlock.gif        DependencyProperty.RegisterAttached(
InBlock.gif          
"TheProperty",
InBlock.gif          
typeof(int), 
InBlock.gif          
typeof(CustomAttachedPropertyClass),
InBlock.gif          
new PropertyMetadata(0)
InBlock.gif        );
InBlock.gif
InBlock.gif    
public static void SetTheProperty(DependencyObject d, int value)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        d.SetValue(ThePropertyProperty, value);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public static int GetTheProperty(DependencyObject d)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return (int)d.GetValue(ThePropertyProperty);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

据说在Avalon中,为从属属性和附加属性提供了Cache的功能,因此应该效率还能保证。但是我对此持怀疑态度。没有做过具体的测试,就不好说了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值