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

简介: 原文:WPF和Expression Blend开发实例:Adorner(装饰器)应用实例装饰器-- 表示用于修饰 UIElement 的 FrameworkElement 的抽象类 简单来说就是,在不改变一个UIElement结构的情况下,将一个Visual对象加到它上面.
原文: 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

目录
相关文章
|
2月前
|
C#
浅谈WPF之装饰器实现控件锚点
使用过visio的都知道,在绘制流程图时,当选择或鼠标移动到控件时,都会在控件的四周出现锚点,以便于修改大小,移动位置,或连接线等,那此功能是如何实现的呢?在WPF开发中,想要在控件四周实现锚点,可以通过装饰器来实现,今天通过一个简单的小例子,简述如何在WPF开发中,应用装饰器,仅供学习分享使用,如有不足之处,还请指正。
96 1
|
8月前
|
C# 开发者
一款WPF开发的网易云音乐客户端 - DMSkin-CloudMusic
一款WPF开发的网易云音乐客户端 - DMSkin-CloudMusic
167 36
|
8月前
|
程序员 C# 异构计算
一个为程序员定制的、WPF开发的小巧、美观桌面快捷工具
一个为程序员定制的、WPF开发的小巧、美观桌面快捷工具
80 0
|
12月前
|
数据可视化 前端开发 C#
WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(三)(上)
WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(三)(上)
120 1
|
12月前
|
设计模式 前端开发 测试技术
WPF开发之Prism详解【内附源码】
WPF开发之Prism详解【内附源码】
305 0
|
12月前
|
C#
WPF工控组态软件之冷却塔和空气压缩机开发
WPF工控组态软件之冷却塔和空气压缩机开发
214 0
|
12月前
|
C#
WPF工控组态软件之管道和冷却风扇开发
WPF工控组态软件之管道和冷却风扇开发
204 0
|
12月前
|
C# 数据库 C++
WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(完)(下)
WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(完)(下)
378 0
|
12月前
|
前端开发 C# UED
WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(完)(上)
WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(完)(上)
253 0
|
12月前
|
C# 数据库
WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(四)(下)
WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(四)(下)
145 0