有的时候,给指定的控件,追加一个装饰器Adorner,备注下
有的时候,给指定的控件,追加一个装饰器Adorner,备注下
比如给某个图片加个工具条等等...都可以采用装饰器的方式来实现,复用性高,易维护,特此备注下
整体效果如下:

1 <Window x:Class="AdornerDemo.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:AdornerDemo"
7 mc:Ignorable="d"
8 WindowStartupLocation="CenterScreen"
9 Title="MainWindow" Height="215.753" Width="467.123">
10 <Grid>
11 <TextBox x:Name="tb" Width="100" Height="40" />
12 </Grid>
13 </Window>
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Windows;
7 using System.Windows.Controls;
8 using System.Windows.Data;
9 using System.Windows.Documents;
10 using System.Windows.Input;
11 using System.Windows.Media;
12 using System.Windows.Media.Imaging;
13 using System.Windows.Navigation;
14 using System.Windows.Shapes;
15
16 namespace AdornerDemo
17 {
18 /// <summary>
19 /// MainWindow.xaml 的交互逻辑
20 /// </summary>
21 public partial class MainWindow : Window
22 {
23 public MainWindow()
24 {
25 InitializeComponent();
26
27 Loaded += MainWindow_Loaded;
28 }
29
30 private void MainWindow_Loaded(object sender, RoutedEventArgs e)
31 {
32 var ad = AdornerLayer.GetAdornerLayer(tb);
33 ad.Add(new CustomAdorner(tb));
34 }
35 }
36 }
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Windows;
7 using System.Windows.Controls;
8 using System.Windows.Documents;
9 using System.Windows.Input;
10 using System.Windows.Media;
11
12 namespace AdornerDemo
13 {
14 class CustomAdorner : Adorner
15 {
16 VisualCollection _visuals;
17 Canvas _canvas;
18 TextBlock block;
19
20 public CustomAdorner(UIElement adornedElement) : base(adornedElement)
21 {
22 _visuals = new VisualCollection(this);
23 block = new TextBlock();
24 block.Text = "√";
25 block.Cursor = Cursors.Hand;
26 block.MouseLeftButtonUp += Block_MouseLeftButtonUp;
27
28 _canvas = new Canvas();
29 _canvas.Children.Add(block);
30 _visuals.Add(_canvas);
31 }
32
33 private void Block_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
34 {
35 MessageBox.Show("xl");
36 }
37
38 protected override int VisualChildrenCount => _visuals.Count;
39
40 protected override Visual GetVisualChild(int index)
41 {
42 return _visuals[index];
43 }
44
45 protected override Size ArrangeOverride(Size finalSize)
46 {
47 _canvas.Arrange(new Rect(finalSize));
48 block.Margin = new Thickness(finalSize.Width + 3, 0, 0, 0);
49 return base.ArrangeOverride(finalSize);
50 }
51 }
52 }
有的时候,给指定的控件,追加一个装饰器Adorner,备注下的更多相关文章
- jquery设置checkbox状态,设置dropdownlist选中值,隐藏某控件,给某控件追加东西
jquery设置checkbox状态 $("[ID$=chkType]").attr("checked", true); jquery设置dropdownlis ...
- VC++ 如何在显示对话框的时候,指定焦点控件!
很简单: 在你的CAddDlg类的OnInitDialog函数中加上你上面的代码GetDlgItem(IDC_EDIT1)->SetFocus();最后记得return FALSE; 其实,不知 ...
- MVVMLight 实现指定Frame控件的导航
原文:MVVMLight 实现指定Frame控件的导航 在UWP开发中,利用汉堡菜单实现导航是常见的方法.汉堡菜单导航一般都需要新建一个Frame控件,并对其进行导航,但是在MvvmLight框架默认 ...
- <iOS小技巧>UIview指定设置控件圆角
一.用法: 众所周知,设置控件的圆角使用layer.cornerRadius属性即可,但是这样设置成的结果是4个边角都是圆角类型. 利用班赛尔曲线画角: //利用班赛尔曲线画角 UIB ...
- NX二次开发-Block UI C++界面Specify Point(指定点)控件的获取(持续补充)
Specify Point(指定点)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); / ...
- iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...
- 关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)
概述 数据切片器在电子商务网站上很常见 - 它们可以帮助用户快速过滤所选商品,并且所有过滤选项都可以在一个地方使用,通常包含核心控件类型为:清单,范围栏和单选按钮等.在ComponentOne For ...
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...
- 自定义两个控件,一个是显示图标和文字的矩形,一个是带边框的label(但是不是label)
记录遇到的两个坑 坑1. 一开始我继承button 来实现下面的控件1,后面发现button没有双击事件.就改成继承UserControl了.重新编译,导致设计时的控件文本全部被清空,因为UserCo ...
- 给easyui datebox时间框控件扩展一个清空的实例
给easyui datebox扩展一个清空的实例 步骤一:拓展插件 /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; ( ...
随机推荐
- “天翼云息壤杯”高校AI大赛云南赛区启动!
11月19日,首届全国"天翼云息壤杯"高校AI大赛云南赛区启动仪式在昆明理工大学举行.本次赛事由中国电信云南公司(以下简称"云南电信")和云南省计算机学会智能计 ...
- java推送企业微信消息
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcl ...
- SpringBoot实现HandlerInterceptor拦截器的接口没有需要重写的方法也不报错是怎么回事
以前实现HandlerInterceptor接口,总会提示需要实现3个方法(preHandle.postHandle.afterCompletion).现在没有出现提示.原因:这是Java8的新特性- ...
- 动态能力理论&知识管理理论--商业之所见
动态能力理论:企业整合,建立和再配置内外部资源以适应快速变化环境的能力. (1)"动态"指的是适应不断变化的环境,企业必须具有不断更新自身能力的能力: (2)"能力&qu ...
- QT5笔记:34. 视口和窗口
 例子: void Widget::paintEvent(QP ...
- QT5笔记:10. 容器类的迭代
1. 这里指的是Java类型的迭代器,即使用方式和Java中一致 代器的使用例子(适用于可读可写迭代器) QList<QString>list;//声明容器类 list << ...
- Hive - 多种表类型的CURD测试
关于torc.textfile.orc.es.hyperdrive表的CURD测试 TORC(支持事务的orc表)测试 TORC(分区表)测试 TEXTFILE 表测试 ORC 表测试 ES(Elas ...
- CentOS7安装部署ClickHouse(单机版&&集群部署)
1.1 什么是ClickHouse ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报 ...
- Vulnhub-Zico2靶机-漏扫弱口令数据库+文件包含反弹shell+zip,tar提权
一.靶机搭建 选择扫描虚拟机 选择路径即可 二.信息收集 官方信息 先看一下官网的信息 级别:中级 目标:获取root并读取标志文件 说明: Zico正试图建立自己的网站,但在选择使用什么CMS时遇到 ...
- Vue3生命周期钩子函数深度解析:从源码到实战的万字指南
一.Vue3生命周期革新特性 相较于Vue2,Vue3通过Composition API带来了更灵活的生命周期管理方式.通过onBeforeMount等函数注册钩子时,实际是通过injectHook方 ...