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]); }