【WPF】附加属性

一直都对附加属性理解很模糊,今天看了一篇文章,恍然大悟,用个Demo掩饰一下对附加属性的理解

附加属性,简单的理解就是给一个对象外在的定义一个属性,使得该对象拥有和使用该属性,最典型的是Grid.Row和Canvas.Top的应用

 

1、定义一个空间Rectangle,并且使之旋转30度

        <Rectangle Fill="Red" Width="100" Height="60" RenderTransformOrigin=".5,.5">
            <Rectangle.RenderTransform>
                <RotateTransform Angle="30" />
            </Rectangle.RenderTransform>
        </Rectangle>

2、如果我们有很多控件都需要进行旋转的操作,代码很显得很长很臃肿,这个时候附加属性就派上用场了,我们让Rectangle拥有一个属性Angle,然后控件可以根据Angle属性的值控制旋转的角度

        <Rectangle Fill="Red" Width="100" Height="60" RenderTransformOrigin=".5,.5" local:RotationManager.Angle="30" />

  这样的话就代码就显得更短更清晰了

3、下面定义附加属性,附加属性通过外部类 RotationManager 来定义

    /// <summary>
    /// 旋转控制器
    /// </summary>
    public class RotationManager : DependencyObject
    {
        //附加属性取值
        public static double GetAngle(DependencyObject obj)
        {
            return (double) obj.GetValue(AngleProperty);
        }

        //附加属性赋值
        public static void SetAngle(DependencyObject obj, double value)
        {
            obj.SetValue(AngleProperty, value);
        }

        //注册附加属性,与依赖属性的区别:RegisterAttached
        public static readonly DependencyProperty AngleProperty =
            DependencyProperty.RegisterAttached("Angle", typeof (double), typeof (RotationManager),
                new PropertyMetadata(0.0, OnAngleChanged));

        private static void OnAngleChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            //这里控制旋转
            var element = obj as FrameworkElement;
            if (element != null)
            {
                element.RenderTransform = new RotateTransform((double)e.NewValue);
            }
        }       
    }

 

参考: http://www.cnblogs.com/DebugLZQ/p/3153098.html

posted @ 2014-02-21 14:41  bomo  阅读(2028)  评论(0编辑  收藏  举报