WPF图像上画线 您所在的位置:网站首页 怎么画线描画有照片 WPF图像上画线

WPF图像上画线

2024-07-13 14:41| 来源: 网络整理| 查看: 265

图上显示跟随鼠标的十字交叉线

我们在PageLight页面上实现该功能

第一步,PageLight.xaml添加以下代码

...

工作布局Grid中有两个控件,一个是可变换的图像,一个是承载十字交叉线的Path

第二步,PageLight.xaml.cs中添加以下代码

using System; using System.Collections.Generic; 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.Navigation; using System.Windows.Shapes; namespace wpfbase { public partial class PageLight : Page { // 定义十字交叉线 private LineGeometry lineX, lineY; private GeometryGroup linegroup; public PageLight() { InitializeComponent(); // 初始化十字交叉线 lineX = new LineGeometry(); lineY = new LineGeometry(); linegroup = new GeometryGroup(); crossline.Data = linegroup; linegroup.Children.Add(lineX); linegroup.Children.Add(lineY); this.SizeChanged += new System.Windows.SizeChangedEventHandler(PageLightResized); // 工作区添加滚轮事件冒泡 workspace.PreviewMouseWheel += (sender, e) => { var eventArg = new MouseWheelEventArgs(e.MouseDevice,e.Timestamp,e.Delta); eventArg.RoutedEvent = UIElement.MouseWheelEvent; eventArg.Source = sender; workspace.RaiseEvent(eventArg); }; } /* ------------页面缩放响应-------------- */ private void PageLightResized(object sender, System.EventArgs e) { // 窗口及图像的ActualWidth均发生改变 // 窗口实际尺寸,图像比例下实际尺寸 var group = workspace.FindResource("Imageview") as TransformGroup; var scale = group.Children[0] as ScaleTransform; var move = group.Children[1] as TranslateTransform; move.X = 0; move.Y = 0; scale.ScaleX = 1; scale.ScaleY = 1; } /* -------------图像缩放处理--------------- */ // img为可视区域,image为图像 private bool mouseDown; private Point position; private void ImgMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if(!image.IsMouseOver && !crossline.IsMouseOver) {return;} image.CaptureMouse(); mouseDown = true; position = e.GetPosition(imgcontrol); Point mouseXY = e.GetPosition(workspace); } private void ImgMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if(!image.IsMouseOver && !crossline.IsMouseOver) {return;} image.ReleaseMouseCapture(); mouseDown = false; } private void ImgMouseMove(object sender, MouseEventArgs e) { if(!image.IsMouseOver && !crossline.IsMouseOver) { ClearCrossLine(); return; } if(mouseDown) { DoMouseMove(imgcontrol, e); } Point mouse = e.GetPosition(imgcontrol); FlashCrossLine(mouse); } private void ImgMouseLeave(object sender, MouseEventArgs e) { ClearCrossLine(); } private void ClearCrossLine() { lineX.StartPoint = new Point(); lineX.EndPoint = new Point(); lineY.StartPoint = new Point(); lineY.EndPoint = new Point(); } private void FlashCrossLine(Point mouse) { var group = workspace.FindResource("Imageview") as TransformGroup; double scale = (group.Children[0] as ScaleTransform).ScaleX; var move = group.Children[1] as TranslateTransform; double W = imgcontrol.ActualWidth; double H = imgcontrol.ActualHeight; double w = image.ActualWidth; double h = image.ActualHeight; lineX.StartPoint = new Point(mouse.X, Math.Max(0, move.Y+(H-h)/2)); lineX.EndPoint = new Point(mouse.X, Math.Min(H, move.Y+h*scale+(H-h)/2)); lineY.StartPoint = new Point(Math.Max(0, move.X+(W-w)/2), mouse.Y); lineY.EndPoint = new Point(Math.Min(W, move.X+w*scale+(W-w)/2), mouse.Y); } private void DoMouseMove(ContentControl img, MouseEventArgs e) { if(e.LeftButton != MouseButtonState.Pressed) {return;} var group = workspace.FindResource("Imageview") as TransformGroup; double scale = (group.Children[0] as ScaleTransform).ScaleX; var move = group.Children[1] as TranslateTransform; var mouseXY = e.GetPosition(img); move.X += mouseXY.X - position.X; move.Y += mouseXY.Y - position.Y; position = mouseXY; // W+w > 2*move_x > -((2*scale-1)*w + W) 水平平移限制条件 // H+h > 2*move_y > -((2*scale-1)*h + H) 垂直平移限制条件 double W = img.ActualWidth; double H = img.ActualHeight; double w = image.ActualWidth; double h = image.ActualHeight; if(move.X*2 > W+w-20) move.X = (W+w-20)/2; if(-move.X*2 > (2*scale-1)*w+W-20) move.X = 10-(scale-0.5)*w-W/2; if(move.Y*2 > H+h-20) move.Y = (H+h-20)/2; if(-move.Y*2 > (2*scale-1)*h+H-20) move.Y = 10-(scale-0.5)*h-H/2; } private void ImgMouseWheel(object sender, MouseWheelEventArgs e) { if(!image.IsMouseOver && !crossline.IsMouseOver) {return;} var point = e.GetPosition(image); var group = workspace.FindResource("Imageview") as TransformGroup; var delta = e.Delta * 0.002; DoWheelZoom(group, point, delta); Point mouse = e.GetPosition(imgcontrol); FlashCrossLine(mouse); } private void DoWheelZoom(TransformGroup group, Point point, double delta) { var transform = group.Children[0] as ScaleTransform; if (transform.ScaleX + delta


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有