c# – 使用MouseMove事件在画布内移动动态绘制的矩形
发布时间:2020-12-16 02:01:28 所属栏目:百科 来源:网络整理
导读:我正在尝试在画布内移动一个动态绘制的矩形.我能够在画布中动态绘制矩形,同时尝试在画布内移动矩形我遇到问题 XAML: Grid x:Name="Gridimage1" Margin="0,411,100" Image Name="image1" HorizontalAlignment="Left" Stretch="Fill" VerticalAlignment="Top"
我正在尝试在画布内移动一个动态绘制的矩形.我能够在画布中动态绘制矩形,同时尝试在画布内移动矩形我遇到问题
XAML: <Grid x:Name="Gridimage1" Margin="0,411,100"> <Image Name="image1" HorizontalAlignment="Left" Stretch="Fill" VerticalAlignment="Top"></Image> <Canvas x:Name="BackPanel" Margin="20,67,0" Height="317" Width="331"> <Rectangle x:Name="selectionRectangle" Stroke="LightBlue" Fill="#220000FF"/> </Canvas> </Grid> C# : 动态绘制矩形后,我正在添加以下鼠标事件. selectionRectangle.MouseLeftButtonDown += new MouseButtonEventHandler(Rect1_MouseDown); selectionRectangle.MouseMove += new MouseEventHandler(Rectangle_MouseMove_1); selectionRectangle.MouseUp += new MouseButtonEventHandler(Rect1_MouseUp); # region "rectangle move" private bool drag = false; private Point startPt; private int wid; private int hei; private Point lastLoc; private double CanvasLeft,CanvasTop; private void Rect1_MouseDown(object sender,MouseButtonEventArgs e) { drag = true; Cursor = Cursors.Hand; startPt = e.GetPosition(BackPanel); wid = (int)selectionRectangle.Width; hei = (int)selectionRectangle.Height; lastLoc = new Point(Canvas.GetLeft(selectionRectangle),Canvas.GetTop(selectionRectangle)); Mouse.Capture((IInputElement)sender); } private void Rectangle_MouseMove_1(object sender,MouseEventArgs e) { try { if (drag) { var newX = (startPt.X + (e.GetPosition(BackPanel).X - startPt.X)); var newY = (startPt.Y + (e.GetPosition(BackPanel).Y - startPt.Y)); Point offset = new Point((startPt.X - lastLoc.X),(startPt.Y - lastLoc.Y)); CanvasTop = newY - offset.Y; CanvasLeft = newX - offset.X; selectionRectangle.SetValue(Canvas.TopProperty,CanvasTop); selectionRectangle.SetValue(Canvas.LeftProperty,CanvasLeft); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void Rect1_MouseUp(object sender,MouseButtonEventArgs e) { drag = false; Cursor = Cursors.Arrow; Mouse.Capture(null); } #endregion 问题:我可以在整个窗口移动矩形.我只想在画布边缘内移动矩形. 我可以在画布外移动矩形 解决方法
在提交拖动操作之前,您应该能够获取selectionRectangle的边界并查看它们是否超出画布的宽度和/或高度.
selectionRectangle.MouseMove += new MouseEventHandler(Rectangle_MouseMove_1); private bool drag = false; private Point startPt; private int wid; private int hei; private Point lastLoc; private double CanvasLeft,CanvasTop; private void Rectangle_MouseMove_1(object sender,MouseEventArgs e) { try { if (drag) { var newX = (startPt.X + (e.GetPosition(BackPanel).X - startPt.X)); var newY = (startPt.Y + (e.GetPosition(BackPanel).Y - startPt.Y)); Point offset = new Point((startPt.X - lastLoc.X),(startPt.Y - lastLoc.Y)); CanvasTop = newY - offset.Y; CanvasLeft = newX - offset.X; // check if the drag will pull the rectangle outside of it's host canvas before performing // TODO: protect against lower limits too... if ((CanvasTop + selectionRectangle.Height > BackPanel.Height) || (CanvasLeft + selectionRectangle.Width > BackPanel.Width) || CanvasTop < 0 || CanvasLeft < 0) { return; } selectionRectangle.SetValue(Canvas.TopProperty,CanvasTop); selectionRectangle.SetValue(Canvas.LeftProperty,CanvasLeft); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |