可移动线条(两端可移动,点击中间移动整个线条)

记录这篇博客方便自己时间久了可以回顾。

 

Xaml文件:

<Window x:Class="Arrows.MainWindow"
        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:Arrows"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" MouseMove="Window_MouseMove" MouseLeftButtonDown="Window_MouseLeftButtonDown" >
    <Canvas x:Name="ca1" >
        <Canvas x:Name="ca">
        </Canvas>
    </Canvas>
</Window>

window标签中添加了鼠标移动和鼠标左键点击事件以及两个Canvas容器

 

CS文件:

下面就是简单的代码了,算法比较简单有待改进;

 

 

 public MainWindow()
        {
            InitializeComponent();

          //如果多次适用线段的话,记得移除事件,否则出现事件累加的情况
            l1.AddHandler(Line.MouseLeftButtonUpEvent, new MouseButtonEventHandler(this.btn_MouseLeftButtonUp), true);
            System.Drawing.Color c = ColorTranslator.FromHtml("Black");
            SolidColorBrush SCB = new SolidColorBrush(System.Windows.Media.Color.FromArgb(c.A, c.R, c.G, c.B));
            l1.Stroke = SCB;
            l1.StrokeThickness = 2;
            Lab.Foreground = SCB;
        }
        Line l1 = new Line();
        Label Lab = new Label();
        System.Windows.Point p = new System.Windows.Point();
        int buttonDown = 0;
        bool flag1 = false;
        bool flag2 = false;
        bool flag3 = false;
        private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (buttonDown == 0)
            {
                ca.Children.Remove(l1);
                p = e.GetPosition(ca);
                l1.X1 = p.X;
                l1.Y1 = p.Y;
                ca.Children.Add(l1);
                ca.Children.Add(Lab);
                buttonDown += 1;
            }
            else if (buttonDown == 1)
            {
                p = e.GetPosition(ca);
                l1.X2 = p.X;
                l1.Y2 = p.Y;
                buttonDown += 1;
                GetLabelPosition();
            }
            else if ((l1.X1 - p.X) * (l1.X1 - p.X) + (l1.Y1 - p.Y) * (l1.Y1 - p.Y) < 300)
            {
                flag1 = true;
            }
            else if ((l1.X2 - p.X) * (l1.X2 - p.X) + (l1.Y2 - p.Y) * (l1.Y2 - p.Y) < 300)
            {
                flag2 = true;
            }
            else if (((l1.X2 + l1.X1) / 2 - p.X) * ((l1.X2 + l1.X1) / 2 - p.X) + ((l1.Y2 + l1.Y1) / 2 - p.Y) * ((l1.Y2 + l1.Y1) / 2 - p.Y) < 300)
            {
                flag3 = true;
            }
        }
        private void Window_MouseMove(object sender, MouseEventArgs e)
        {
            p = e.GetPosition(ca);
            if (buttonDown == 0)
                return;
            else if (buttonDown == 1)
            {
                l1.X2 = p.X;
                l1.Y2 = p.Y;
            }
            else if (flag1)
            {
                l1.CaptureMouse();
                l1.Cursor = Cursors.Hand;
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                    l1.X1 = p.X;
                    l1.Y1 = p.Y;
                }
                GetLabelPosition();
            }
            else if (flag2)
            {
                l1.CaptureMouse();
                l1.Cursor = Cursors.Hand;
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                    l1.X2 = p.X;
                    l1.Y2 = p.Y;
                }
                GetLabelPosition();
            }
            else if (flag3)
            {
                double x1 = l1.X1 + p.X - (l1.X2 + l1.X1) / 2;
                double y1 = l1.Y1 + p.Y - (l1.Y2 + l1.Y1) / 2;
                double x2 = l1.X2 + p.X - (l1.X2 + l1.X1) / 2;
                double y2 = l1.Y2 + p.Y - (l1.Y2 + l1.Y1) / 2; ;
                l1.CaptureMouse();
                l1.Cursor = Cursors.Hand;
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                    l1.X1 = x1;
                    l1.Y1 = y1;
                    l1.X2 = x2;
                    l1.Y2 = y2;
                }
                GetLabelPosition();
            }
        }
        void btn_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Line tmp = (Line)sender;
            tmp.ReleaseMouseCapture();
            flag1 = false;
            flag2 = false;
            flag3 = false;
        }

        void GetLabelPosition()
        {
            if (l1.X1 <= l1.X2)
            {
                Canvas.SetLeft(Lab, l1.X2);
                Canvas.SetTop(Lab, l1.Y2);
            }
            else
            {
                Canvas.SetLeft(Lab, l1.X1);
                Canvas.SetTop(Lab, l1.Y1);
            }
            Lab.Content = Math.Sqrt(Math.Pow(l1.X2 - l1.X1, 2) + Math.Pow(l1.Y2 - l1.Y1, 2)).ToString("0.00");
        }

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值