有的时候,给指定的控件,追加一个装饰器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,备注下的更多相关文章

  1. jquery设置checkbox状态,设置dropdownlist选中值,隐藏某控件,给某控件追加东西

    jquery设置checkbox状态 $("[ID$=chkType]").attr("checked", true); jquery设置dropdownlis ...

  2. VC++ 如何在显示对话框的时候,指定焦点控件!

    很简单: 在你的CAddDlg类的OnInitDialog函数中加上你上面的代码GetDlgItem(IDC_EDIT1)->SetFocus();最后记得return FALSE; 其实,不知 ...

  3. MVVMLight 实现指定Frame控件的导航

    原文:MVVMLight 实现指定Frame控件的导航 在UWP开发中,利用汉堡菜单实现导航是常见的方法.汉堡菜单导航一般都需要新建一个Frame控件,并对其进行导航,但是在MvvmLight框架默认 ...

  4. <iOS小技巧>UIview指定设置控件圆角

      一.用法:   众所周知,设置控件的圆角使用layer.cornerRadius属性即可,但是这样设置成的结果是4个边角都是圆角类型.   利用班赛尔曲线画角:   //利用班赛尔曲线画角 UIB ...

  5. NX二次开发-Block UI C++界面Specify Point(指定点)控件的获取(持续补充)

    Specify Point(指定点)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); / ...

  6. iOS开发UI篇—使用picker View控件完成一个简单的选餐应用

    iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...

  7. 关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)

    概述 数据切片器在电子商务网站上很常见 - 它们可以帮助用户快速过滤所选商品,并且所有过滤选项都可以在一个地方使用,通常包含核心控件类型为:清单,范围栏和单选按钮等.在ComponentOne For ...

  8. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  9. 自定义两个控件,一个是显示图标和文字的矩形,一个是带边框的label(但是不是label)

    记录遇到的两个坑 坑1. 一开始我继承button 来实现下面的控件1,后面发现button没有双击事件.就改成继承UserControl了.重新编译,导致设计时的控件文本全部被清空,因为UserCo ...

  10. 给easyui datebox时间框控件扩展一个清空的实例

    给easyui datebox扩展一个清空的实例 步骤一:拓展插件 /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; ( ...

随机推荐

  1. uni-app路由跳转

    navigateTo redirectTo (1)保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面 (如果A->B来回频繁切换,不要A B两个方法都使用 ...

  2. Maven配置多仓库

    一.配置说明 <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="htt ...

  3. 浏览器自动化与AI Agent结合项目browser-use初探

    browser-use介绍 browser-use是将您的 AI 代理连接到浏览器的最简单方式.它通过提供一个强大且简单的接口来实现 AI 代理访问网站的自动化. GitHub地址:https://g ...

  4. python 输入与输出函数,格式化输出,注释,变量,整数,浮点数,字符串,布尔等说明

    python 输入函数:input   语法:input("提示文字") 注意:用input输入的内容都是字符串: 输出函数:print   语法:print() -------- ...

  5. [HDU5396] Expression 题解

    每次合并两个数,做过石子合并的人都能看出来是区间 dp. 设状态 \(dp_{i,j}\) 表示区间 \([i,j]\) 中合并为一个数的所有情况之和. 那么我们就可以枚举断点 \(k\): \(b_ ...

  6. Bean的原始版本与最终版本不一致?记一次Spring IOC探索之旅

    前言 在这个信息技术发展迅速的时代,万万没想到,Spring自2003年发展至今,仍是技术选型中的首选,某些项目甚至有Spring全家桶的情况. 在Java开发者面试当中,Spring的原理也常被面试 ...

  7. JS经纬度坐标转换

    var GPS = { PI : 3.14159265358979324, x_pi : 3.14159265358979324 * 3000.0 / 180.0, delta : function ...

  8. git码云安装及使用菜鸟教程

    1.下载Windows本地码云 https://mirrors.huaweicloud.com/git-for-windows/(华为镜像下载),选择合适的版本下载,此处下载速度要快些 2.登录码云官 ...

  9. C语言线程池的常见实现方式详解

    在 C 语言中,线程池通常通过 pthread 库来实现.以下是一个详细的说明,介绍了 C 语言线程池的常见实现方式,包括核心概念.实现步骤和具体的代码示例. 点击查看代码 1. 线程池的基本结构 线 ...

  10. ubuntu20.04使用EasyConnect

    起因:BUAA校外访问内网vpn的客户端 用的学校vpn内下载的deb包EasyConnect_x64_7_6_7_3.deb,就直接sudo apt install安装了,之后应用的目录在/usr/ ...