参照自:https://www.cnblogs.com/jixin/p/4730170.html
https://blog.csdn.net/u012408847/article/details/86482399

截图功能将会把红色方块区域内的内容截取下来,保存在img文件夹中。

window1.xaml

<Window x:Class="_1_5GraphicsWpf.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:_1_5GraphicsWpf"xmlns:cvr="clr-namespace:_1_5GraphicsWpf.ControlValidationRule"mc:Ignorable="d"Title="Window1" Height="450" Width="800"><Grid><DockPanel  Background="AliceBlue"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="5*"></ColumnDefinition><ColumnDefinition Width="13*"></ColumnDefinition></Grid.ColumnDefinitions><Canvas Grid.Column="1" x:Name="myCanvas"   DockPanel.Dock="Right" Background="LightGray" PreviewMouseLeftButtonDown="Canvas_PreviewMouseLeftButtonDown" PreviewMouseMove="Canvas_PreviewMouseMove"MouseLeftButtonUp="MyCanvas_MouseLeftButtonUp" ></Canvas><Grid DockPanel.Dock="Left" x:Name="LeftDockPanel"><Grid.ColumnDefinitions><ColumnDefinition Width="*"></ColumnDefinition><ColumnDefinition Width="3*"></ColumnDefinition></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition><RowDefinition Height="30px"></RowDefinition></Grid.RowDefinitions><Label Grid.Column="0" Grid.Row="0">颜色œ˜œ˜œ˜œ˜</Label><ComboBox x:Name="ComboColor" Grid.Row="0" Grid.Column="1" Margin="6 3"SelectedValuePath="{Binding Path=ID}" SelectedIndex="{Binding Path=Combo_ColorIndex}" ><ComboBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Path=PColor}"></TextBlock></StackPanel></DataTemplate></ComboBox.ItemTemplate></ComboBox><Label Grid.Column="0" Grid.Row="1">线条粗细œ˜œ˜œ˜œ˜</Label><TextBox x:Name="textBoxThick" Grid.Row="1"  Grid.Column="1" Margin="6,3" ><TextBox.Text><Binding  Path="Thickness" NotifyOnValidationError="True" NotifyOnSourceUpdated="True" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"><Binding.ValidationRules><cvr:DataValidationRule ValidatesOnTargetUpdated="True"></cvr:DataValidationRule></Binding.ValidationRules></Binding></TextBox.Text></TextBox><Slider Minimum="0" Maximum="100" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="2" Value="{Binding Path=Thickness, Mode=TwoWay}"></Slider><Label Grid.Column="0" Grid.Row="3">样式œ˜œ˜œ˜œ˜</Label><ComboBox x:Name="ComboStyle" Grid.Row="3" Grid.Column="1" Margin="6 3"SelectedValuePath="{Binding Path=ID}" SelectedIndex="{Binding Path=Combo_StyleIndex}" ><ComboBox.ItemTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Path=PStyle}"></TextBlock></StackPanel></DataTemplate></ComboBox.ItemTemplate></ComboBox><Button Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Margin="10 3" Content="清除" Click="Button_Click"></Button><Button Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2" Margin="10 3" Content="截图" Click="Button_Click_1"></Button></Grid></Grid></DockPanel></Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using _1_5GraphicsWpf.ViewModel;
using _1_5GraphicsWpf.ControlValidationRule;
using System.Drawing;namespace _1_5GraphicsWpf
{public partial class Window1 : Window{public Window1(){InitializeComponent();Init();}ObservableCollection<VMColor> ColorCollection;ObservableCollection<VMStyle> StyleCollection;Global_Window1 GlobalVaries;void Init(){ColorCollection = new ObservableCollection<VMColor> {new VMColor{ID = 0,PColor="默认"},new VMColor{ID = 1,PColor="红色"},new VMColor{ID = 2,PColor="绿色" }};StyleCollection = new ObservableCollection<VMStyle> {new VMStyle{ID = 0,PStyle="平坦"},new VMStyle{ID = 1,PStyle="直角"},new VMStyle{ID = 2,PStyle="三角"},new VMStyle{ID = 3,PStyle="圆形"}};GlobalVaries = new Global_Window1() {Combo_ColorIndex = 0,Combo_StyleIndex = 0,Thickness = 1};this.ComboColor.ItemsSource = ColorCollection;this.ComboStyle.ItemsSource = StyleCollection; this.DataContext = GlobalVaries;this.textBoxThick.AddHandler(Validation.ErrorEvent,new RoutedEventHandler(this.ValidationError));}void ValidationError(object sender,RoutedEventArgs e){TextBox obj = sender as TextBox;if (Validation.GetErrors(obj).Count>0){obj.ToolTip = Validation.GetErrors(this.textBoxThick)[0].ErrorContent.ToString();}}System.Windows.Point startPoint;List<System.Windows.Point> pointList = new List<System.Windows.Point>();private void Canvas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e){startPoint = e.GetPosition(myCanvas);}private void Canvas_PreviewMouseMove(object sender, MouseEventArgs e){if (e.LeftButton == MouseButtonState.Pressed){// 返回指针相对于Canvas的位置System.Windows.Point point = e.GetPosition(myCanvas);if (pointList.Count == 0){// 加入起始点pointList.Add(new System.Windows.Point(this.startPoint.X, this.startPoint.Y));}else{// 加入移动过程中的point  颜色pointList.Add(point);}// 去重复点var disList = pointList.Distinct().ToList();var count = disList.Count(); // 总点数if (point != this.startPoint && this.startPoint != null){var l = new Line();//string color = (ComboColor.SelectedItem as ComboBoxItem).Content as string;int color = int.Parse((ComboColor.SelectedValue as VMColor).ID.ToString());switch (color){case 0:l.Stroke = System.Windows.Media.Brushes.Black;break;case 1:l.Stroke = System.Windows.Media.Brushes.Red;break;case 2:l.Stroke = System.Windows.Media.Brushes.Green;break;default:l.Stroke = System.Windows.Media.Brushes.Black;break;}int style = int.Parse((ComboStyle.SelectedValue as VMStyle).ID.ToString());switch (style){case 0:l.StrokeDashCap = PenLineCap.Flat;l.StrokeStartLineCap = PenLineCap.Flat;l.StrokeEndLineCap = PenLineCap.Flat;break;case 1:l.StrokeDashCap = PenLineCap.Square;l.StrokeStartLineCap = PenLineCap.Square;l.StrokeEndLineCap = PenLineCap.Square;break;case 2:l.StrokeDashCap = PenLineCap.Triangle;l.StrokeStartLineCap = PenLineCap.Triangle;l.StrokeEndLineCap = PenLineCap.Triangle;break;case 3:l.StrokeDashCap = PenLineCap.Round;l.StrokeStartLineCap = PenLineCap.Round;l.StrokeEndLineCap = PenLineCap.Round;break;default:l.StrokeDashCap = PenLineCap.Round;l.StrokeStartLineCap = PenLineCap.Round;l.StrokeEndLineCap = PenLineCap.Round;break;}//l.StrokeLineJoin = PenLineJoin.Round;//l.StrokeStartLineCap = PenLineCap.Triangle;l.StrokeThickness = this.GlobalVaries.Thickness ;if (count < 2)return;l.X1 = disList[count - 2].X;  // count-2  保证 line的起始点为点集合中的倒数第二个点。l.Y1 = disList[count - 2].Y;// 终点X,Y 为当前point的X,Y l.X2 = point.X;l.Y2 = point.Y;myCanvas.Children.Add(l);}}}private void MyCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){pointList.Clear();}private void Button_Click(object sender, RoutedEventArgs e){this.myCanvas.Children.Clear();//清除pointList.Clear();}#region 截图public static Shape CreateShape(){//矩形区域return new System.Windows.Shapes.Rectangle() { Fill = null, Stroke = System.Windows.Media.Brushes.Red, StrokeThickness = 1 };//圆形区域//return new System.Windows.Shapes.Ellipse() { Fill = null, Stroke = System.Windows.Media.Brushes.Red, StrokeThickness = 1 };}bool drawFlag = false;Shape insertShape;System.Windows.Point startPosition;private void Mask_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){insertShape = CreateShape();if (insertShape != null){drawFlag = true;Canvas board = sender as Canvas;//board.Children.Clear();startPosition = e.GetPosition(board);insertShape.Opacity = 1;Canvas.SetLeft(insertShape, e.GetPosition(board).X);Canvas.SetTop(insertShape, e.GetPosition(board).Y);board.Children.Add(insertShape);}}private void image_MouseMove(object sender, MouseEventArgs e){Canvas board = sender as Canvas;if (drawFlag && insertShape != null){if (e.GetPosition(board).X > startPosition.X){insertShape.Width = e.GetPosition(board).X - startPosition.X;//Canvas.SetRight(insertShape, startPosition.X);}else{insertShape.Width = startPosition.X - e.GetPosition(board).X;Canvas.SetLeft(insertShape, e.GetPosition(board).X);}if (e.GetPosition(board).Y > startPosition.Y){insertShape.Height = e.GetPosition(board).Y - startPosition.Y;//Canvas.SetBottom(insertShape, startPosition.Y);}else{insertShape.Height = startPosition.Y - e.GetPosition(board).Y;Canvas.SetTop(insertShape, e.GetPosition(board).Y);}}}private void Mask_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){Canvas board = sender as Canvas;System.Windows.Point position = board.PointToScreen(new System.Windows.Point(0, 0));drawFlag = false;int width = (int)insertShape.Width +150 ;int height = (int)insertShape.Height +110 ;System.Drawing.Size size = new System.Drawing.Size(width, height);int startX = (e.GetPosition(board).X < startPosition.X) ? (int)e.GetPosition(board).X  : (int)startPosition.X ;int startY = (e.GetPosition(board).Y < startPosition.Y) ? (int)e.GetPosition(board).Y  : (int)startPosition.Y ;//int endX = (e.GetPosition(board).X > startPosition.X) ? (int)e.GetPosition(board).X + 10 : (int)startPosition.X + 10;//int endY = (e.GetPosition(board).Y > startPosition.Y) ? (int)e.GetPosition(board).Y + 10 : (int)startPosition.Y + 10;if (insertShape != null){insertShape.Opacity = 1;System.Windows.Point p = e.GetPosition(board);//BitmapSource  memory = new Bitmap(width, height);//Graphics g = Graphics.FromImage(memory);//g.CopyFromScreen(this.Location.X + 1, this.Location.Y + 1, 0, 0, new System.Drawing.Size(width, height));Clipboard.SetImage(memory);//把图片放到剪切板中//bmp.Save("C:\\Screenshots\\" + filename);using (Bitmap bmp = new Bitmap(width, height)){using (Graphics g = Graphics.FromImage(bmp)){String filename = "ScreenCapture-" + DateTime.Now.ToString("ddMMyyyy-hhmmss") + ".png";g.CopyFromScreen(startX+(int)position.X, startY+(int)position.Y, 0, 0, size);bmp.Save("..\\..\\img\\" + filename);Button_Click_2();}}}}#endregionbool canShot = false;private void Button_Click_1(object sender, RoutedEventArgs e){this.myCanvas.MouseLeftButtonDown += Mask_MouseLeftButtonDown;this.myCanvas.MouseMove += image_MouseMove;this.myCanvas.MouseLeftButtonUp += Mask_MouseLeftButtonUp;this.myCanvas.PreviewMouseLeftButtonDown -= Canvas_PreviewMouseLeftButtonDown;this.myCanvas.PreviewMouseMove -= Canvas_PreviewMouseMove;this.myCanvas.MouseLeftButtonUp -= MyCanvas_MouseLeftButtonUp;canShot = true;}private void Button_Click_2(){if (canShot ==true){this.myCanvas.MouseLeftButtonDown -= Mask_MouseLeftButtonDown;this.myCanvas.MouseMove -= image_MouseMove;this.myCanvas.MouseLeftButtonUp -= Mask_MouseLeftButtonUp;this.myCanvas.PreviewMouseLeftButtonDown += Canvas_PreviewMouseLeftButtonDown;this.myCanvas.PreviewMouseMove += Canvas_PreviewMouseMove;this.myCanvas.MouseLeftButtonUp += MyCanvas_MouseLeftButtonUp;}canShot = false;}}
}

wpf实现简易画板功能(带截取画板,签名截图等等)相关推荐

  1. Sketch入门基础-画布、Artboard(画板)功能介绍

    Sketch mac 提供了丰富的矢量绘图和文字工具,你可以使用sketch mac来设计界面.网站.图标等,非常的实用.此次小编带大家了解Sketch入门基础-画布.Artboard(画板)功能. ...

  2. python怎么建立画板_Python基于opencv实现的简单画板功能示例

    本文实例讲述了Python基于opencv实现的简单画板功能.分享给大家供大家参考,具体如下: import cv2 import numpy as np drawing = False # true ...

  3. android画板需求分析,Android编程实现画板功能的方法总结【附源码下载】

    本文实例讲述了Android编程实现画板功能的方法.分享给大家供大家参考,具体如下: Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现.当然自定义Vie ...

  4. 《Cocos Creator游戏实战》你画我猜中的画板功能

    你画我猜中的画板功能 创建节点 完成脚本 本节我们来做一个画板,该画板一共有三个小功能: 调节笔刷大小 改变笔刷颜色 橡皮擦 运行效果如下: Cocos Creator版本:2.2.0 后台回复&qu ...

  5. 巧用canvas实现画板功能,使用画笔在图片上涂画,橡皮擦可擦除涂画,并保存

    canvas 是HTML5的元素,使用JavaScript 在网页上绘制图像. canvas 拥有多种绘制路径.矩形.圆形.字符以及添加图像的方法. 而如果想实现画笔在画板涂画画笔在图片上涂画,橡皮擦 ...

  6. tkinter Canvas 实现 鼠标手绘画板 功能

    下面代码简单实现了手绘画板功能,其实也是Canvas的教程,后面都给加了注释. 这里通过列表来存储笔画,实现撤销恢复功能,右键有菜单. import tkinter as tk from tkinte ...

  7. Android如何实现画板功能?

    前言 Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现.当然自定义View内部也是用的Canvas. 自定义View 创建一个自定义View(推荐Sur ...

  8. html实现画板的基本操作,javascript实现画板功能

    本文实例为大家分享了javascript实现画板功能的具体代码,供大家参考,具体内容如下 画板功能的实现 *{ margin: 0; padding: 0; list-style: none; } b ...

  9. Android实现画板功能(一)

    前言 最近看到了一些Android手写相关的功能,比如说: 钉钉手写签名功能,输入法手写功能,笔记类App的手写记录功能等.最近在工作中也遇到了类似的需求,其实实现画板功能并不复杂,所以我就打算在这里 ...

最新文章

  1. 快速问医生如何快速实现 患者与医生即时问诊?
  2. C的动态优化 约瑟夫环
  3. java给定_Java – 在给定示例中使用super()
  4. linux配置redis服务,Linux下安装Redis并设置相关服务
  5. 阿里云智能总裁张建锋:保护客户数据安全是第一原则
  6. 【计算机网络】复习荟萃(四)
  7. 【小程序开发】微信小程序开发中遇到的那些坑...
  8. 2014 百度之星 1003 题解 Xor Sum
  9. nvidia控制面板只有3d设置?
  10. ESRI大赛三维模块介绍
  11. 聊聊docker【二】基本命令
  12. 制作一个App的完整流程是哪些
  13. CAD文件零基础批量转换DWG格式
  14. 奔图打印机驱动linux安装方法,奔图3100打印机驱动
  15. 计算某一点绕另一点旋转一定角度后的坐标
  16. 缺失值处理(Imputation)
  17. 爱情三十九课,爱的礼物
  18. Oracle 执行计划(Explain Plan)
  19. 执行matlab 部分程序
  20. 爬取百大弹幕,大家还是喜欢上罗老师的课!

热门文章

  1. 史上最强最全网站资源整理
  2. 小程序记录页面停留时间
  3. linux服务器配置与管理_【13】进大厂必须掌握的面试题-配置管理面试 - Java架构师社区...
  4. 电子科技大学现代电子信息系统综合实验课程部分模拟试题
  5. 设置VirtualBox共享文件夹的方法
  6. ubuntu20.04界面黑屏,有光标闪烁,解决方法
  7. WEB 渗透之SSTI 模板注入
  8. python找数字做加法升级版答案_python学数学1-2:认识数字--自然数加法
  9. Java网络编程入门,包含网络相关概念、InetAddress类、套接字Socket、网络上传和下载文件等
  10. OpenGL原理与实践——核心模式(六):光照贴图、光源分类以及多光源场景主要源码实现