Adorner 装饰器
装饰器 Adorner
装饰器是WPF中较为常用的技术之一,也是不同于XAML的技术。
较为特殊。
特殊于装饰器全部由C#构成,不同于ControlTenmpate和Style的元素。
装饰器在某些方面能够简化前两者的代码量。
现在简单的说一下装饰器的入门用法(通常用法和附加属性一起使用)
Adorner是一个抽象类。
由于显示装饰器的方式有两种
直接装载现有WPF控件
绘制控件
直接装载现有控件:
这种方法需要重载四个Adorner方法
- GetVisualChild //获取Visual的子控件索引
- ArrangeOverride //确定装饰器的定位
- MeasureOverride //确定装饰器要约束道德大小
- VisualChildrenCount//获取VisualCollection的集合数量
重写之后就是
编写 私有的VsualCollection来存储你要装载的控件。
然后利用MeasureOverride和ArrangeOverride这两个方法来进行定位和约束大小。
下面的代码是 可以随时更新内容的装饰器
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Shapes; namespace 装饰器
{
public class TestAdorner : Adorner
{ private Grid _Grid;
private Ellipse _Ellipse;
private TextBlock _TextBlock;
private VisualCollection collection;
private UIElement _UIElement; public void UPDATE(string Text)
{
var grid = collection[] as Grid; (grid.Children[] as TextBlock).Text=Text; }
public TestAdorner(UIElement adornedElement) : base(adornedElement)
{
collection = new VisualCollection(this); _Grid = new Grid()
{
Width=
,
Height= };
_Ellipse = new Ellipse()
{
Fill = new SolidColorBrush(Colors.Red)
};
_TextBlock = new TextBlock()
{
HorizontalAlignment = HorizontalAlignment.Center
,
VerticalAlignment = VerticalAlignment.Center
,
FontSize= }; _Grid.Children.Add(_Ellipse); _Grid.Children.Add(_TextBlock); collection.Add(_Grid); _UIElement = adornedElement; } protected override int VisualChildrenCount => collection.Count; protected override Visual GetVisualChild(int index) => collection[index]; protected override Size MeasureOverride(Size constraint) => base.MeasureOverride(constraint); protected override Size ArrangeOverride(Size finalSize)
{
_Grid.Arrange(new Rect(finalSize));
_Grid.Margin = new Thickness((_UIElement as Button).ActualWidth-, , , (_UIElement as Button).ActualHeight-);
return base.ArrangeOverride(finalSize); }
}
}
XAML页面
<Grid>
<Button x:Name="TestBtn" Content="选中" Loaded="A_Loaded" Height="" Width=""/>
</Grid>
CS页面
namespace 装饰器
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
AdornerLayer layer; DispatcherTimer timer; public MainWindow()
{
InitializeComponent(); timer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds()
}; timer.Tick += Timer_Tick; } private void Timer_Tick(object sender, EventArgs e)
{
if (i == )
timer.Stop();
var b= layer.GetAdorners(TestBtn) ?? null;
if(b!=null)
{
var k=b[] as TestAdorner;
k.UPDATE(i.ToString()); }
else
{
var j = new TestAdorner(TestBtn);
j.UPDATE(.ToString());
layer.Add(j);
}
i++; } int i = ; private void A_Loaded(object sender, RoutedEventArgs e)
{
layer = AdornerLayer.GetAdornerLayer(TestBtn);
timer.Start();
}
}
}
效果图

绘制控件
绘制需要重载一个方法就好了
- OnRender//绘制控件
不过值得注意的是,绘制方式无法更新。至少我是不会。
现在给出代码
namespace 装饰器
{
public class TestAdornerOnRender : Adorner
{ public TestAdornerOnRender(UIElement adornedElement) : base(adornedElement) { } protected override void OnRender(DrawingContext drawingContext)
{ FormattedText t = new FormattedText(
"!!!!!",
CultureInfo.InstalledUICulture,
FlowDirection.LeftToRight,
new Typeface("微软雅黑"),
, new SolidColorBrush(Colors.Red)
);
drawingContext.DrawText(t, new Point(, ));
base.OnRender(drawingContext);
} }
}
xaml页面
<Grid>
<Button x:Name="TestBtn" Content="选中" Loaded="A_Loaded" Height="" Width=""> </Button>
</Grid>
cs 页面
private void A_Loaded(object sender, RoutedEventArgs e)
{
var layer = AdornerLayer.GetAdornerLayer(TestBtn); layer.Add(new TestAdornerOnRender(TestBtn)); }
截图

Adorner 装饰器的更多相关文章
- WPF和Expression Blend开发实例:Adorner(装饰器)应用实例
装饰器-- 表示用于修饰 UIElement 的 FrameworkElement 的抽象类 简单来说就是,在不改变一个UIElement结构的情况下,将一个Visual对象加到它上面. 应用举例: ...
- WPF装饰器
装饰器定义: 装饰器是一种特殊类型的 FrameworkElement,用于向用户提供可视化提示. 对于其他用户,装饰器可用于将功能控点添加到元素中或提供有关控件的状态信息. 装饰器可以在不改变原有的 ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- python装饰器
今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- [原创]django+ldap实现单点登录(装饰器和缓存)
前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...
- PHP 装饰器模式
装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...
- python cookbook 学习系列(一) python中的装饰器
简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...
- python基础补漏-05-生成器和装饰器
[1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...
随机推荐
- IOS 键盘的显示与关闭
在每一个IOS应用中,几乎不可避免的要进行文本输入操作,例如要求用户填写登陆注册信息,进行话题的评论回复,等等.用到的文本输入组件有UITextField,UITextView,对于这两个组件的相关属 ...
- 从零玩转JavaWeb系列7web服务器-----用户登录界面二维码的制作
1.用eclipse工具新建一个Dynamic Web Project工程如下: 2.在Java Resources的src目录下新建一个包,包名称为com.it666.code 3.在com.it6 ...
- 获取web.xml配置文件中的初始化值
TestServletConfig.java package com.huawei.config; import java.io.IOException;import java.util.Enumer ...
- 从0开始用spring boot编写分布式配置中心-peppa
欢迎大家一起来编写peppa github地址: github 交流群: 目前市面上比较流行的分布式配置中心有disconf.apollo,用起来还是比较方便的,然而由于在权限管理这块做得不够好,导致 ...
- pyinstaller打包后运行提示找不到模块
截止到2017年9月20号,pyinstaller只支持到python3.5,如果需要支持到3.6,需要自己在github上下载pyinstaller的开发版. 在打包时候,并没有提示错误,可以顺利打 ...
- openLDAP 2
一.安装OPENLDAP 二.打开安装目录中的文件 slapd.conf 三.安装完成后退出 编辑文本,输入以下内容,并命名为test.ldif dn: dc=company objectClass: ...
- Qt5.11参考文档
Qt5.11参考文档: http://www.bim-times.com/qt/Qt-5.11.1/qtdoc/index.html (来源于Qt官网)
- 346. Moving Average from Data Stream数据窗口流中位数的数据结构设计
[抄题]: Given a stream of integers and a window size, calculate the moving average of all integers in ...
- Linux虚拟机磁盘扩容
扩容步骤如下: 1.添加一块物理硬盘 2.fdisk将硬盘分区,选primary分区,创建1-4个 3.分区类型格式化,选择t,输入LVM代号 4.分好后按w退出 如果是调整原有逻辑卷大小,则先调整原 ...
- win10 startup启动目录路径命令
仅对当前用户生效: C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 开始-运行 shel ...