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关键字,那么该函数就不再是普通函数,而是生成器 ...
随机推荐
- Pycharm 激活码 2019年1月9日16:57:13
K03CHKJCFT-eyJsaWNlbnNlSWQiOiJLMDNDSEtKQ0ZUIiwibGljZW5zZWVOYW1lIjoibnNzIDEwMDEiLCJhc3NpZ25lZU5hbWUiO ...
- Dreamweaver基本操作
1.站点管理 在网站设计前,我们需要先建立站点,再进行网站设计. 站点 作用:用来归纳一个网站上所有的网页.素材及他们之间的联系. 站点根文件夹命名规则:由数字.字母.下划线组成,数字不能在开头. 首 ...
- ES6中新添加的Array.prototype.fill
用法 array.fill(start=0, end=this.length) 示例 [1, 2, 3].fill(4) // [4, 4, 4] [1, 2, 3].fill(4, 1) // [1 ...
- LeetCode之位操作题java
191. Number of 1 Bits Total Accepted: 87985 Total Submissions: 234407 Difficulty: Easy Write a funct ...
- poolmanager1.path-o-logical 很好的prefab preload工具
http://docs.poolmanager1.path-o-logical.com/ 提高性能的不错选择
- Computer2
luo@luo-All-Series:~/MyFile/TensorflowProject$ conda create -n flappbird1 python=3.7Solving environm ...
- 16-多线程爬取糗事百科(python+Tread)
https://www.cnblogs.com/alamZ/p/7414020.html 课件内容 #_*_ coding: utf-8 _*_ ''' Created on 2018年7月17日 ...
- 53-C++ CH08 01
http://lx.lanqiao.cn/problem.page?gpid=T407 算法训练 C++ CH08 01 时间限制:1.0s 内存限制:256.0MB 问题描述 已 ...
- WIFI配置专项测试
1. 测试项目 A. 路由器加密方式测试: B. 路由器信道选择测试: C. DHCP过期时间测试 D. 路由器WIFI密码复杂度测试: 2. 测试结果 2.1. 加密方式测试 路由器密码为简单,其他 ...
- 采用AutoIt实现文件上传
在非常规的上传界面中,AutoIt可以操作Windows资源管理器实现上传路径的输入. AutoIt中编辑以下脚本,需通过“AutoIt Windows Info”定位资源管理器路径输入位置信息及打开 ...