附加属性,顾名思义,和被附加的控件没有依赖关系,只是强行给目标控件挂上一个“属性值”,以便于操作之。就好比,你在学校是学生,那么就要听老师的管教,在公司是下属,就要服从老板的命令一样。

我们常见的附加属性有grid.row,canvas.left等属性,这些属性目标控件并无多大关联,附加到你所使用的控件上,则可以被其真实依赖的对象所"驱动"。

下面我们来简单模拟以下Canvas.Left的实现方式。

如图,这是我们正常情况下使用附加属性的情景。

现在我们做一个我们自定义的“Canvas.Left”

1.建立附加属性真实依赖对象以及附加属性

新建附加属性与依赖属性如出一辙,只是Api稍不同。

public static DependencyProperty
LeftProperty = DependencyProperty.RegisterAttached
("Left", typeof(double), typeof(Bruce), new PropertyMetadata(0.0)

设置属性的显示名称所属类型以及初始值

之后给该属性设置Get,Set静态方法,不然再Xaml中访问不到,很好理解,你再xaml中某个控件中也不太方便new其他的控件啊!这里的Get,Set猜测是反射获取调用的,熟悉java的同学应该看着比较亲切。

public static double GetLeft(DependencyObject obj)
{
return (double)obj.GetValue(LeftProperty);
}
public static void SetLeft(DependencyObject obj,object value)
{
obj.SetValue(LeftProperty, value);
}

最后在xaml中在目标控件上,添加此属性。

 2.添加"行为"

到这边我们的附加属性已经设置好了,但是只是给它赋值了,还没有添加属性的行为。

public static DependencyProperty
LeftProperty = DependencyProperty.RegisterAttached
("Left", typeof(double), typeof(Bruce), new PropertyMetadata(0.0,(obj,e)=>
{
var element=obj as FrameworkElement;//目标控件
if (element.Parent.GetType() == typeof(Canvas))
{
element.Margin = new Thickness((double)e.NewValue,,,);
}
}));

到这里我们的"Bruce.Left"附加属性就完成了,咱们来看看效果。

最后附上全部代码

public class Bruce:DependencyObject
{
public static double GetLeft(DependencyObject obj)
{
return (double)obj.GetValue(LeftProperty);
}
public static void SetLeft(DependencyObject obj,object value)
{
obj.SetValue(LeftProperty, value);
}
public static DependencyProperty
LeftProperty = DependencyProperty.RegisterAttached
("Left", typeof(double), typeof(Bruce), new PropertyMetadata(0.0,(obj,e)=>
{
var element=obj as FrameworkElement;//目标控件
if (element.Parent.GetType() == typeof(Canvas))
{
element.Margin = new Thickness((double)e.NewValue,,,);
}
})); }

WPF属性之理解附加属性的更多相关文章

  1. WPF属性(二)附加属性

    原文:WPF属性(二)附加属性 附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解 ...

  2. WPF - 属性系统 - APaas(AttachedProperty as a service)

    是的,文章的题目看起来很牛,我承认. 附加属性是WPF中的一个非常重要的功能.例如在设置布局的过程中,软件开发人员就常常通过DockPanel的Dock附加属性来设置其各个子元素所处的布局位置.同样地 ...

  3. WPF - 属性系统 (4 of 4)

    依赖项属性的重写 在基于C#的编程中,对属性的重写常常是一种行之有效的解决方案:在基类所提供的属性访问符实现不能满足当前要求的时候,我们就需要重新定义属性的访问符. 但对于依赖项属性而言,属性执行逻辑 ...

  4. WPF - 属性系统 (2 of 4)

    属性更改回调 前一章的示例中,对各个参数的设置都非常容易理解.如果我们仅仅需要创建一个独立的依赖项属性,那么上面所提到的创建依赖项属性的基础知识足以满足需求.但是事情往往并非如此完美.在一个系统中,很 ...

  5. WPF - 属性系统 (1 of 4)

    本来我希望这一系列文章能够深入讲解WPF属性系统的实现以及XAML编译器是如何使用这些依赖项属性的,并在最后分析WPF属性系统的实际实现代码.但是在编写的过程中发现对WPF属性系统代码的讲解要求之前的 ...

  6. WPF - 属性系统 (3 of 4)

    依赖项属性元数据 在前面的章节中,我们已经介绍了WPF依赖项属性元数据中的两个组成:CoerceValueCallback回调以及PropertyChangedCallback.而在本节中,我们将对其 ...

  7. iOS数据存储之属性列表理解

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

  8. prototype属性的理解

    1.对象:对象是JS的基本数据类型(原始类型(数字.字符串和布尔值),对象类型).对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值. 2.三类JS对象和两类属性: 内 ...

  9. WPF 属性系统 依赖属性之内存占用分析

    关于WPF的属性系统园子内有不少这方面的文章.里面大都提到了WPF依赖属性的在内存方面的优化.但是里面大都一笔带过.那么WPF到底是怎么样节约内存的.我们通过WPF属性和普通的CLR属性对比来看一下W ...

随机推荐

  1. User-Agent结构介绍及主流浏览器User-Agent大全

    User-Agent结构介绍及主流浏览器User-Agent大全:https://blog.csdn.net/qianxing111/article/details/79415857 一.基础知识篇: ...

  2. 从零开始学编程_第A001期_C语言HelloWorld详解

    emmm,这是我的第一篇博客. 作为一个软件工程专业的学生,我希望自己能在编程方面有不错的成就,我们老师告诉我们学编程就要写博客,在写博客的过程中不断成长,结交朋友,所以我就开始尝试写专业相关的博客. ...

  3. HDU 6538 Neko and quadrilateral(极角排序+旋转坐标系)

    这道题简直太好了,对于计算几何选手需要掌握的一个方法. 首先对于求解四边形面积,我们可以将四边形按对角线划分成两个三角形,显然此时四边形的面积最大最小值就变成了求解里这个对角线最近最远的点对. 对于此 ...

  4. java视频资源

    1.Java基础阶段 尚学堂_刘凯立_JavaSE基础视频 http://pan.baidu.com/s/1geCoY11 尚学堂_高淇_Java300集视频教程 https://pan.baidu. ...

  5. Java 异步编程

    昨天头儿给的学习文档我还没看完,头儿说:“MongoDB光会简单的添删改查什么的不行,要深入了解,你们连$set和$inc使用场景都分不清.” 确实,学习过一年多SQL,确实对学习MongoDB有点影 ...

  6. IIS是怎么处理多个请求的?

      一,假设有一台服务器,它的IIS上部署有一个Web应用程序-S,可以通过浏览器或其他方式进行访问.     假设有A.B.C三台电脑同时访问网站S,IIS接收到3个HTTP请求,然后分别为三个请求 ...

  7. ajax图片上传(asp.net +jquery+ashx)

    一.建立Default.aspx页面 <%@ Page Language="C#" AutoEventWireup="true"  CodeFile=&q ...

  8. Jsp 自定义tag标签

    1转自:https://blog.csdn.net/yusimiao/article/details/46835617 Jsp自定义tag标签 自定义tag标签的好处 程序员可以自定一些特定功能的标记 ...

  9. sqoop使用中文手册

    文章转载自:http://www.zihou.me/html/2014/01/28/9114.html 1.     概述 本文档主要对SQOOP的使用进行了说明,参考内容主要来自于Cloudera ...

  10. 一、VS支持Vue语法

    一.VS支持Vue语法