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

装饰器--

表示用于修饰 UIElement 的 FrameworkElement 的抽象类

简单来说就是,在不改变一个UIElement结构的情况下,将一个Visual对象加到它上面.

应用举例:

现在我们拥有一个文本框,但是我们需要限定输入的字符串,当输入的是非法字符串的时候,要求将文本框的四周包裹一个红色的边框.通常我们可以用Border将文本框包裹在里面,然后动态地改变它的颜色来实现功能.那么现在我们可以直接在文本框上面加一个装饰器来实现.

Adorner类

AdornerLayer类

装饰器是放在装饰层(AdornerLayer)里面的,这就意味着我们可以添加多个装饰器到UIElement上.通过AdornerLayer的静态方法GetAdornerLayer,我们可以很轻松的获取一个UIElement的装饰层.

接下来我们只要继承Adorner这个抽象类,来实现一个真实可用的装饰器,然后把装饰器加到控件的装饰层上面就可以了.

public class AdornerForTextBox : Adorner
{
    private VisualCollection visual;
    private Border border;

    public AdornerForTextBox(UIElement uiElement)
        : base(uiElement)
    {
        visual = new VisualCollection(this);
        #region 定义装饰器的样子
        border = new Border();
        border.BorderBrush = Brushes.Red;
        border.BorderThickness = new Thickness(1);
        border.Height = 20;
        border.Width = 80;
        #endregion
        visual.Add(border);
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return visual.Count;
        }
    }

    protected override Visual GetVisualChild(int index)
    {
        return visual[index];
    }

    protected override Size MeasureOverride(Size constraint)
    {
        return base.MeasureOverride(constraint);
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        border.Arrange(new Rect(finalSize));
        border.Margin = new Thickness(0, 0, 0, 0);//绘制装饰器在元素上的最终位置
        return base.ArrangeOverride(finalSize);
    }}

显示装饰器

var adornerLayer = AdornerLayer.GetAdornerLayer(tb_Adorner);
if (adornerLayer != null)
{
    //清空原有的装饰器
    var adorners = adornerLayer.GetAdorners(tb_Adorner);
    if (adorners != null && adorners.Count() > 0)
    {
        for (int i = 0; i < adorners.Count(); i++)
        {
            adornerLayer.Remove(adorners[i]);
        }
    }

    adornerLayer.Add(new AdornerForTextBox(tb_Adorner));
}

效果图:

源代码下载:

http://files.cnblogs.com/youngytj/AdornerTest.rar

时间: 2024-10-11 05:53:44

WPF和Expression Blend开发实例:Adorner(装饰器)应用实例的相关文章

WPF和Expression Blend开发实例:模拟QQ登陆界面打开和关闭特效

不管在消费者的心中腾讯是一个怎么样的模仿者抄袭者的形象,但是腾讯在软件交互上的设计一直是一流的.正如某位已故的知名产品经理所说的:设计并非外观怎样,感觉如何.设计的是产品的工作原理.我觉得腾讯掌握了其精髓.在2013版的桌面版QQ中,腾讯的登陆界面在打开的时候有一个展开的过程,而关闭的时候有个收缩的过程.效果如图: 借助WPF和Expression Blend,我们可以轻易的实现这么一个效果,最终用比较慢的速率实现这个效果如下: 这个效果一共能够分成两个部分:展开和收缩,具体的代码如下: 收缩的

WPF和Expression Blend开发实例:充分利用Blend实现一个探照灯的效果

本篇文章阅读的基础是在读者对于WPF有一定的了解并且有WPF相关的编码经验,对于Blend的界面布局有基础的知识.文章中对于相应的在Blend中的操作进行演示,并不会进行细致到每个属性的介绍.同时,本篇文章所用的Blend版本是5.0.40218.0,即VS2012对应的版本,对于其他版本的操作区别,请读者自行研究.Ok,我们现在开始,本篇文章最终的效果如下图所示: 好,我们开始分步介绍过程,除了最后设计的一个按钮的后台代码需要使用到代码之外,其余的操作我们都使用图形操作. 1.新建项目 打开B

WPF和Expression Blend开发实例:Loading动画

今天来点实际的,项目中可以真实使用的,一个Loading的动画,最后封装成一个控件,可以直接使用在项目中,先上图: 整个设计比较简单,就是在界面上画18个Path,然后通过动画改变OpacityMask的值来实现一种动态的效果. 因为整个过程比较简单,所以其实没有用到Blend,唯一一个需要注意的是Path的路径值是请美工从PS里生成的,路径如下: <Geometry x:Key="Block"> M291.15499,85.897525 C291.15499,85.897

WPF和Expression Blend开发实例:一个样式实现的数字输入框

今天来一个比较奇淫技巧的手法,很少人用,同时也不推荐太过频繁的使用. 先上样式: <Style x:Key="NumberTextBox" TargetType="{x:Type FrameworkElement}"> <EventSetter Event="PreviewTextInput" Handler="TextBox_TextInput"/> <Setter Value="Fa

Adorner 装饰器

装饰器 Adorner 装饰器是WPF中较为常用的技术之一,也是不同于XAML的技术. 较为特殊. 特殊于装饰器全部由C#构成,不同于ControlTenmpate和Style的元素. 装饰器在某些方面能够简化前两者的代码量. 现在简单的说一下装饰器的入门用法(通常用法和附加属性一起使用) Adorner是一个抽象类. 由于显示装饰器的方式有两种 直接装载现有WPF控件 绘制控件 直接装载现有控件: 这种方法需要重载四个Adorner方法 GetVisualChild //获取Visual的子控

python之路_函数实例及装饰器介绍

一.习题讲解 1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组.例如:[('红心',2), ('草花',2), -('黑桃,'A')] def cards(): num=[] for v in range(2,11): num.append(v) num.extend(['J','Q','K','A']) type=['红心','草花','方块','黑桃'] result=[] for i in num: for j in type: result.append((j,i)) re

Python装饰器有趣实例探究

廖老师的教程实在太高深,没弄懂,点击打开链接 def deco_functionNeedDoc(func): if func.__doc__ == None : print func, "has no __doc__, it's a bad habit." else: print func, ':', func.__doc__, '.' return func @deco_functionNeedDoc def f(): print 'f() Do something' @deco_f

Python装饰器简单实例

#!/usr/bin/env python __author__ = '氨蛋三键' class Tracer: def __init__(self, fun): self.calls = 0 self.fun = fun def __call__(self, *args, **kwargs): self.calls += 1 print("Tracer 第 %s 次调用的函数是 %s " % (self.calls, self.fun.__name__)) self.fun(*args

Python 装饰器的形成过程

装饰器  定义:本质是函数,(装饰其他函数),即为其他函数添加附加功能.  原则: 1.不能修改被装饰的函数的源代码:            2.不能修改被装饰的函数的调用方式. 实现装饰器知识储备:   1. 函数即'变量'           2. 高阶函数       a. 把一个函数名当作实参传递给另一个函数(在不修改被装饰函数源代码的前提下为其添加新功能)       b. 返回值中包含函数名(不修改函数的调用方式)   3. 嵌套函数 高阶函数 + 嵌套函数 (组成)--> 装饰器