附加属性(Attached Properties)基础

附加属性是Extensible Application MarkupLanguage (XAML) 定义的一个概念。 附加属性旨在用作可在任何对象上设置的一类全局属性。  Windows Presentation Foundation (WPF) 中,附加属性通常定义为没有常规属性“包装”的一种特殊形式的依赖项属性。也就是说,附加属性是说一个属性本来不属于某个对象,是根据某种特殊需求附加到该对象的。

举个形象的例子,去做火车,你就有了座位号这个属性;假如不做火车就没有这个属性。

1. 附加属性与普通依赖属性

  • 通过RegisterAttached方法注册而不是Register方法。
  • 没有普通的.NET属性包装器,而是通过GetSet属性名来实现属性包装。
  • 没有普通的.NET属性。

2.附加属性的用途

  • 附加属性的一个用途是允许不同的子元素为实际在父元素中定义的属性指定唯一值。最常用的就是Grid.RowGrid.ColumnDockPanel.Dock
  • 为对象附加一些属性。譬如为DockPanel设置FontSize属性,DockPanel本身没有FontSize属性,通过以下方法设置(DockPanel设置了字体,但是GroupBoxHeader是不受影响的,影响了其中的子元素)
[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. <GroupBox Header="附加属性用法1" Grid.Column="0" Grid.Row="0" >  
  2.     <DockPanel TextElement.FontSize="20">  
  3.         <Button Content="button1" DockPanel.Dock="Bottom" />  
  4.         <Button Content="button2" DockPanel.Dock="Right"/>  
  5.         <Button Content="button3" />  
  6.     </DockPanel>  
  7. </GroupBox>  
效果如下:

3.代码中的附加属性

WPF中的附加属性没有用于简化 get/set访问的典型 CLR“包装”方法。这是因为附加属性不是必须属于设置它的实例的 CLR命名空间的一部分。但是,XAML读取器必须能够在处理 XAML时设置这些值。若要成为有效的附加属性,附加属性的所有者类型必须实现 Get属性名 Set属性名形式的专用访问器方法。这些专用的访问器方法也有助于在代码中获取或设置附加属性。从代码的角度而言,附加属性类似于具有方法访问器(而不是属性访问器)的支持字段,并且该支持字段可以存在于任何对象上,而不需要专门定义。

下面的示例演示如何在代码中设置附加属性:

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. private void AddControl()  
  2. {  
  3.     Label label = new Label();  
  4.     label.Content = "通过代码添加";  
  5.     mainGird.Children.Add(label);  
  6.     Grid.SetColumn(label, 0);  
  7.     Grid.SetRow(label, 1);  
  8. }  

 

4.自定义附加属性

实例:自定义一个角度附加属性,使得控件对象旋转一定的角度。

代码如下:

依赖属性实现:

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. namespace WPF_Properties  
  2. {  
  3.     using System.Windows;  
  4.     using System.Windows.Media;  
  5.   
  6.     public class MyAttachedProperties : DependencyObject  
  7.     {  
  8.         public static double GetAngle(DependencyObject obj)  
  9.         {  
  10.             return (double)obj.GetValue(AngleProperty);  
  11.         }  
  12.   
  13.         public static void SetAngle(DependencyObject obj, double value)  
  14.         {  
  15.             obj.SetValue(AngleProperty, value);  
  16.         }  
  17.   
  18.         public static readonly DependencyProperty AngleProperty =  
  19.             DependencyProperty.RegisterAttached("Angle", typeof(double), typeof(MyAttachedProperties), new PropertyMetadata(0.0, OnAngleChanged));  
  20.   
  21.         private static void OnAngleChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)  
  22.         {  
  23.             var element = obj as UIElement;  
  24.             if (element != null)  
  25.             {  
  26.                 element.RenderTransformOrigin = new Point(0.5, 0.5);  
  27.                 element.RenderTransform = new RotateTransform((double)e.NewValue);  
  28.             }  
  29.         }        
  30.     }  
  31. }  

XAML使用:

 

 

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. <GroupBox Header="附加属性用法1" Grid.Column="0" Grid.Row="0" >  
  2.     <DockPanel TextElement.FontSize="20">  
  3.         <Button Content="button1" DockPanel.Dock="Bottom" local:MyAttachedProperties.Angle="180" />  
  4.         <Button Content="button2" DockPanel.Dock="Right" local:MyAttachedProperties.Angle="10"/>  
  5.         <Button Content="button3" />  
  6.     </DockPanel>  
  7. </GroupBox>  

效果:

 




posted @ 2016-09-29 21:29  天涯海角路  阅读(653)  评论(0)    收藏  举报