有的时候,给指定的控件,追加一个装饰器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 = '清空'; ( ...
随机推荐
- 蝉联第一,天翼云电脑持续领跑中国DaaS市场!
近日,IDC发布的<中国虚拟桌面软件及云服务市场半年跟踪报告>数据显示,中国电信天翼云在2023年上半年中国桌面即服务(Desktop as a Service,以下简称"Daa ...
- DataV过滤器
人才库: return data.filter(function (item) { return item.职级 === ''; }) 区县分析: //一级指标 const t = Object. ...
- ubuntu通过tar包安装mysql5.7.21
作者:zuoguohui 一.场景:最近想搞mysql主从复制,需要在两台服务器上安装mysql,之前有一台已经装好了mysql5.7.21,于是在另外一台上也装mysql5.7.21,安装过程中碰到 ...
- c#securityexception不允许所请求的注册表访问权
开机自启动程序如下: if (!System.IO.File.Exists(filename)) throw new Exception("该文件不存在 ...
- 小米手机/红米手机解锁BL详细教程
由于MIUI解锁风控提升,全部小米默认为支持解锁BootLoader的 但需要登录小米账号后,到开发者选项将设备和账号绑定0-1000小时,一般默认为168小时,部分新机实际几百小时,具体绑定时间,我 ...
- 001.GItLab介绍及云原生部署
目录 gitlab介绍 gitlab cicd简介 gitlab特点 git主要目录 版本区别 gitlab部署 Omnibus 部署 部署需求 安装依赖 导入软件源 正式安装 准备证书 配置SSL及 ...
- 通用C++ Makefile
点击查看代码 ///////////////////////////////////////////// CC = g++ CFLAGS=-Wall -O2 TARGET = main SRCS := ...
- Selenium 项目搭建过程
Selenium 环境搭建多多少少大概有4.5次了,每次都有东西遗忘,整理下大概的过程: 安装python,下载exe文件 C:\Users\lic\AppData\Local\Programs\Py ...
- Web前端入门第2问:前端开发是什么?与后端、全栈的区别是什么?一个完整的Web项目有哪些角色参与?
一个完整的Web项目有哪些角色参与? 提出需求(这一步可以是甲方,也可以是用户) 需求分析,画出原型图(产品经理) 根据原型图输出 UI 界面及交互图(UI/UX设计师) 根据UI及交互效果画出页面, ...
- Vue3 值得注意的新特性
Vue3 值得注意的新特性 Vue3 新特性介绍 片段 组合式 API 单文件组件组合式 API 语法糖 (<script setup>) Teleport Suspense 实验性 SF ...