有的时候,给指定的控件,追加一个装饰器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 = '清空'; ( ...
随机推荐
- MySQL主从复制-原理实战
一.原理 主从复制架构图:主从复制原理: Mysql 中有一种日志叫做 bin 日志(二进制日志).这个日志会记录下所有修改了数据库的SQL 语句(insert,update,delete,creat ...
- Amis配置
一.穿梭器 { "type": "transfer-picker", "name": "parentMenuId", & ...
- Codeforces 319B Psychos in a Line 题解 [ 绿 ] [ 单调栈 ] [ 动态规划 ] [ adhoc ]
Psychos in a Line:很好的单调栈优化 dp 题! 观察 我们先观察,一个精神病人会一直杀到什么时候.显然,会杀到右边第一个比他大的精神病人那里,然后他就杀不动了. 因此我们可以从右往左 ...
- DeepSeek-R1满血版性能飙升四倍,成本大降,竟是因为……
近日,天翼云DeepSeek模型推理技术迎来重大升级!该技术不仅支撑DeepSeek-R1满血版模型实现性能的四倍提升,更将大规模部署模型的成本降至原来的25%以下,为AI应用落地铺就更为宽广的道路. ...
- Deepseek学习随笔(4)--- DeepSeek 在学术中的应用
文献阅读与总结 对于学术研究人员来说,DeepSeek 可以帮助快速阅读和总结文献: 上传 PDF 文献,输入:请总结本文的研究方法和核心结论 DeepSeek 会生成文献的摘要,帮助你快速了解主要内 ...
- Flink - [04] 窗口(Windows)
题记部分 一.Flink中的窗口是什么 (1)一般真实的流都是无界的,怎样处理无界的数据? (2)可以把无限的数据流进行切分,得到有限的数据集进行处理 -- 也就是得到有界流 (3)窗口(Window ...
- 【日常运维笔记】linux系统修改密码
1.问题描述:xshll无法正常登录服务器,使用宝塔系统后台linux工具修改密码,重启服务器,依然无法登录,怀疑密码未重置成功,我们登录root,重置密码. 使用命令passwd修改密码,需要注意的 ...
- 多版本Java 配置记录
来自 https://blog.csdn.net/zdl177/article/details/105246997 起因是为了启动MC 目录结构 Java总目录下放置多个jdk目录(jdk16.0.2 ...
- 三分钟掌握音视频处理 | 在 Rust 中优雅地使用 FFmpeg
前言 音视频处理看似高深莫测,但在开发中,我们或多或少都会遇到相关需求,比如视频格式转换.剪辑.添加水印.音频提取等. FFmpeg 作为行业标准,几乎无所不能,很多流行的软件(如 VLC.YouTu ...
- k8s v1.19版本之后,自签证书过期x509: certificate has expired or is not yet valid
前言 在 Kubernetes 1.16 版本之前,kubeadm 工具的 alpha certs 子命令用于生成和管理 Kubernetes 集群的证书.然而,从 Kubernetes 1.19 版 ...