zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    k-d tree
    K近邻算法-KNN
    ORB特征提取与匹配
    ZeroMQ一个更小、更快、更简单的智能传输层协议
    ROS导航之参数配置和自适应蒙特卡罗定位
    cmake实战第二篇:让我们的代码更像个工程
    gcc/g++实战之动态链接库与静态链接库编写
    gcc/g++ 实战之编译的四个过程
    通过 LPeg 介绍解析表达式语法(Parsing Expression Grammars)
    Forth 语言概要
  • 原文地址:https://www.cnblogs.com/bomo/p/3559419.html
Copyright © 2011-2022 走看看