当前位置:网站首页>WPF 截图控件之移除控件(九)「仿微信」
WPF 截图控件之移除控件(九)「仿微信」
2022-08-06 02:00:00 【虚幻私塾】
优质资源分享
| 学习路线指引(点击解锁) | 知识定位 | 人群定位 |
|---|---|---|
| 🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
| Python量化交易实战 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
WPF 截图控件之移除控件(九)「仿微信」
WPF 截图控件之移除控件(九)「仿微信」
作者:WPFDevelopersOrg
框架使用大于等于
.NET40;Visual Studio 2022;项目使用 MIT 开源许可协议;
截图控件暂时更新到此,未实现功能如下Hook快捷打开截图。- 添加操作还不能
移动和更改大小 - 获取根据当前坐标返回进程的大小
Rect。 - 获取鼠标区域
RGB。1.WPF实现截屏「仿微信」
2.WPF 实现截屏控件之移动(二)「仿微信」
3.WPF 截图控件之伸缩(三) 「仿微信」
4.WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
5.WPF 截图控件之绘制箭头(五)「仿微信」
6.WPF 截图控件之绘制箭头(六)「仿微信」
7.WPF 截图控件之文字(七)「仿微信」
8.WPF 截图控件之画笔(八)「仿微信」
正文
一、前几篇实现了添加 方框、椭圆、箭头 此时需要删除所添加的操作和撤销上次操作。
1)选中操作
- 在添加方框、椭圆、箭头、画笔、文字的同时需要设置
Tag=Draw用于标记是操作的痕迹 实现MouseLeftButtonDown事件。 - 监听到操作
MouseLeftButtonDown事件后循环VisualTreeHelper.GetChildren获取返回指定可视对象包含的子级个数。判断Tag==Draw设置其Opacity=1清除上次选择。 - 用一个变量存放当前选择的操作使用FrameworkElement,然后设置当前内容
Opacity=0.7
//箭头
controlArrow.MouseLeftButtonDown += (s, e) =>
{
SelectElement();
frameworkElement = s as Control;
frameworkElement.Opacity = .7;
};
//方框
borderRectangle.MouseLeftButtonDown += (s, e) =>
{
SelectElement();
frameworkElement = s as Border;
frameworkElement.Opacity = .7;
};
//椭圆
drawEllipse.MouseLeftButtonDown += (s, e) =>
{
SelectElement();
frameworkElement = s as Ellipse;
frameworkElement.Opacity = .7;
};
//文字
textBorder.PreviewMouseLeftButtonDown += (s, e) =>
{
_radioButtonText.IsChecked = true;
_radioButtonText_Click(null,null);
SelectElement();
var border = s as Border;
frameworkElement = border;
frameworkElement.Opacity = .7;
border.BorderThickness = new Thickness(1);
};
//画笔
polyLine.MouseLeftButtonDown += (s, e) =>
{
_radioButtonInk.IsChecked = true;
_radioButtonInk_Click(null, null);
SelectElement();
frameworkElement = s as Polyline;
frameworkElement.Opacity = .7;
};
void SelectElement()
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(_canvas); i++)
{
var child = VisualTreeHelper.GetChild(_canvas, i);
if (child is FrameworkElement frameworkElement && frameworkElement.Tag != null)
if (frameworkElement.Tag.ToString() == _tag)
frameworkElement.Opacity = 1;
}
}
2)删除操作 按下Delete键删除。
if (e.Key == Key.Delete)
{
if (_canvas.Children.Count > 0)
_canvas.Children.Remove(frameworkElement);
}
3)撤销操作 按下Ctrl+Z 撤销上次操作。
if (e.KeyStates == Keyboard.GetKeyStates(Key.Z) && Keyboard.Modifiers == ModifierKeys.Control)
{
if (_canvas.Children.Count > 0)
_canvas.Children.Remove(_canvas.Children[_canvas.Children.Count - 1]);
}
完整代码如下
项目地址
边栏推荐
猜你喜欢

阿里云技术专家郝晨栋:云上可观测能力,问题的发现与定位实践

ansible fetch 模块

typescript70-ts中的两种文件类型

typescript74 - create your own type declaration files (provide declaration files for existing js)
![[Brush questions series] OJ questions in the sequence table](/img/26/4f66d1c8c7b337b084425a1121427c.png)
[Brush questions series] OJ questions in the sequence table

typescript77 - Create ts-enabled projects in CRA

typescript72-已有的类型声明文件(第三方库的类型文件)

Two file types in typescript70-ts

快速查看Oracle数据库告警日志的存储位置

leetcode linked list oj question
随机推荐
滑动间隔缓存有什么特点呢?
在香橙派OrangePi 3 LTS开发板上安装向日葵远程控制软件的操作方法
typescript74 - create your own type declaration files (provide declaration files for existing js)
为什么黑客不敢攻击微信钱包?
Ribbon的使用、拓展机制以及源码分析
Xpansiv收购APX以扩大环保商品市场基础设施规模
海康联网网关平台级联EasyCVR出现通道无法上线现象,是什么原因?
【回顾】树莓派4B与EC200U-CN的建立连接
QT:用qt实现一个登录界面
缓存算法有哪些分类呢?
pupstudy配置mysql
mavonEditor 导航目录点击锚点定位功能只有在全屏编辑模式下才有效的问题
C语言日记 10 if的嵌套语句(分支结构程序设计)
2022强网杯-07-30-re-GameMaster
typescript77 - Create ts-enabled projects in CRA
STM32与K210串口通信的解码问题(基于正点原子源码)
关于近期轻量化部署任务的一个小结
Soul向港交所递交上市申请,持续发力社交元宇宙赛道
TS(TypeScript) 二元运算符 + , - , * , / , % , << , >> , >>> , & , | , ^ 分析
计算S=a+aa+…+aa…a