装饰器定义:
装饰器是一种特殊类型的 FrameworkElement,用于向用户提供可视化提示。 对于其他用户,装饰器可用于将功能控点添加到元素中或提供有关控件的状态信息。
装饰器可以在不改变原有的控件结构的基础上将功能控点添加到元素中或在界面元素上提供视觉效果等。如WPF中的光标效果、焦点效果等就是通过装饰器实现的。如图 通过WPF inspector看到的装饰器层及Button的默认Focus效果:
           
装饰器是一个始终位于装饰元素或装饰元素集合上方的呈现图面,其呈现独立于该装饰器所绑定到的 UIElement 。WPF中的装饰器是在单独一个层AdornerLayer上进行绘制的,该层位于普通界面元素之上,而且允许存在多个AdornerLayer层进行叠加,当加入AdornerLayer层后,Adorner会默认使用其所装饰元素的左上角作为原点进行定位。
装饰器的应用
1.向 UIElement 添加功能控点,使用这些控点,用户可以通过某种方式(调整大小、旋转、重新定位等等)操作元素。
2.提供可视反馈以指示各种状态,或响应各种事件。
3.在 UIElement 上叠加视觉效果。
4.从视觉上遮盖或重写 UIElement 的一部分或全部。
 
WPF 为装饰视觉元素提供一个基本框架。下表列出了装饰对象时使用的主要类型及其用途。
Adorner 一个抽象基类,所有具体装饰器的实现都从该类继承。
AdornerLayer 一个类,表示一个或多个装饰元素的装饰器的呈现层。
AdornerDecorator 一个类,使装饰器层与元素集合相关联。

 
 
 
 
 
创建装饰器步骤:
1.自定义继承自Adorner的装饰器类:
  public class FocusAdorner : Adorner
{
//被装饰的元素
FrameworkElement _adornedElement = null;
//这里必须调用基类的构造函数
public FocusAdorner(UIElement adornedElement) : base(adornedElement) { }
//通过复写onRender, 实现装饰器的呈现行为
protected override void OnRender(DrawingContext drawingContext)
{ }
}
2.得到指定元素上方的可视化树中第一个装饰器层 public static AdornerLayer GetAdornerLayer(Visual visual)。
3.将装饰器添加到装饰器层:
    private void WindowLoaded(object sender, RoutedEventArgs e)
{
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(_label);
adornerLayer.Add(new ScaleAdorner(_label));
}
小例子:为TextBox重新设计一个Focus效果:
  public class FocusAdorner : Adorner
{
public FocusAdorner(UIElement adornedElement) : base(adornedElement)
{
this.IsHitTestVisible = false;
} protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
Rect adornedElementRect = new Rect(this.AdornedElement.RenderSize);
Pen renderPen = new Pen(new SolidColorBrush(Colors.Red), 1.0); drawingContext.DrawRectangle(new SolidColorBrush(Colors.Transparent), renderPen,adornedElementRect);
}
}
MainPage:
     private void WindowLoaded(object sender, RoutedEventArgs e)
{
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(texBox1);
adornerLayer.Add(new ScaleAdorner(texBox1));
}

当TextBox获得焦点时效果:

WPF装饰器的更多相关文章

  1. WPF标注装饰器

    标注 在许多地方我们都会用到标注,比如在画图中: 在Office中: 在Foxit Reader中: 在Blend中: 等等. 简介 以前,因项目上需要做标注,简单找了一下,没发现适合要求的控件(包括 ...

  2. WPF和Expression Blend开发实例:Adorner(装饰器)应用实例

    装饰器-- 表示用于修饰 UIElement 的 FrameworkElement 的抽象类 简单来说就是,在不改变一个UIElement结构的情况下,将一个Visual对象加到它上面. 应用举例: ...

  3. Adorner 装饰器

    装饰器 Adorner 装饰器是WPF中较为常用的技术之一,也是不同于XAML的技术. 较为特殊. 特殊于装饰器全部由C#构成,不同于ControlTenmpate和Style的元素. 装饰器在某些方 ...

  4. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  5. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  6. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  7. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  8. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  9. python cookbook 学习系列(一) python中的装饰器

    简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...

随机推荐

  1. 美团基于STORM的应用

    https://my.oschina.net/dolphinboy/blog/2933843

  2. 2018/6/29 关于hashmap的总结

    hashMap和ConcurrentHashMap的区别 hashMap内部具体如何实现的 如果hashMap的key是一个自定义的类,怎么办 为什么重写equals还要重写hashcode 一.什么 ...

  3. secureCRT端口转发功能突破防火墙限制

    这样一个场景:A是办公网络的一台windows主机,B是一台Linux堡垒机,C是生产环境一台Oracle主机, A只能访问B但A不能访问C,B可以访问到C,那怎样才可以使A机上的“ PLSQL De ...

  4. Python基础语法-内置数据结构之列表

    列表的一些特点: 列表是最常用的线性数据结构 list是一系列元素的有序组合 list是可变的 列表的操作, 增:append.extend.insert 删:clear.pop.remove 改:r ...

  5. redis集群(主从配置)

    市面上太多kv的缓存,最常用的就属memcache了,但是memcache存在单点问题,不过小日本有复制版本,但是使用的人比较少,redis的出现让kv内存存储的想法成为现实.今天主要内容便是redi ...

  6. 查看指定spid的脚本当前运行情况和状态

    USE MasterGO declare @spid int; select @spid = 419--null:all ; ;WITH DATA(spid,blockRelationship,blo ...

  7. maven-java包管理工具-01

    maven只用来管理java项目,也是用java开发的 传统的项目因为包的管理有很多问题,所以才有的maven的诞生: 1. 项目开始的时候,确定项目中可能要使用到的包,然后下载包,复制粘贴到项目里面 ...

  8. ScintillaNET的应用

    出于工作需要,需要制作一个嵌入在桌面应用中的C语言编辑器,经过一系列调研,目前ScintillaNET应该是最合适的了,开源.轻便.功能丰富,但是踩得坑也很多,接下面一一说道. 目前Scintilla ...

  9. vs2017使用rdlc实现批量打印

    接着上一篇:上一篇写了安装,这篇直接搞定批量打印,A4纸横版竖版页面设计,正式开始.(我的表达不怎么好,我尽量发图片都是程序员一点就通) 一.界面展示 忽略界面设计丑 查看预览界面,因为有数据就不截全 ...

  10. POJ 2591

    #include<iostream> #include<stdio.h> #define MAXN 10000001 using namespace std; int a[MA ...