Click here to Skip to main content
15,895,667 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,

I have the following code for line adorner. I don't know whats go wrong with it but it did not work to move a line. either line moves or we can change only size. Please make suggestion so as to correct it.


C#
public class LineAdorner : Adorner
        {
            bool IsStartPoint = false;
            bool IsControlModeOn = false;
            bool IsMisPoint = false;

            Size size = new Size(10, 10);
            SnapToGrid snap = new SnapToGrid();

            public LineAdorner(UIElement adornedElement)
                : base(adornedElement)
            {
                this.MouseLeftButtonDown += new MouseButtonEventHandler(LineAdorner_MouseLeftButtonDown);
                this.MouseLeftButtonUp += new MouseButtonEventHandler(LineAdorner_MouseLeftButtonUp);
                this.MouseMove += new MouseEventHandler(LineAdorner_MouseMove);
            }

            void LineAdorner_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                if (Keyboard.Modifiers == ModifierKeys.Control)
                    IsControlModeOn = true;

                System.Windows.Shapes.Line line = this.AdornedElement as System.Windows.Shapes.Line;
                LineItem lineItem = line.DataContext as LineItem;
                Point p = snap.Snap(e.GetPosition(line), SnapToGrid.SnapMode.Move);

                double dStart = 0.0;
                double dEnd = 0.0;
                double dmid = 0.0;

                if (!this.IsMouseCaptured)
                {
                    dStart = Math.Sqrt(Math.Pow(line.X1 - p.X, 2) + Math.Pow(line.Y1 - p.Y, 2));
                    dEnd = Math.Sqrt(Math.Pow(line.X2 - p.X, 2) + Math.Pow(line.Y2 - p.Y, 2));
                    dmid = Math.Sqrt(Math.Pow((((line.X2 + line.X1) / 2) - p.X), 2) + Math.Pow((((line.Y2 + line.Y1) / 2) - p.Y), 2));
                }

                if (IsControlModeOn)
                {
                    if (this.IsMouseCaptured)
                    {
                        if (IsStartPoint)
                        {
                            line.X1 = p.X;
                            line.Y1 = p.Y;
                        }
                        else
                        {
                            line.X2 = p.X;
                            line.Y2 = p.Y;
                        }

                        this.InvalidateVisual();
                        this.ReleaseMouseCapture();

                        IsControlModeOn = false;
                    }
                    else
                    {
                        if (dStart < dEnd)
                            IsStartPoint = true;
                        else
                            IsStartPoint = false;

                        this.InvalidateVisual();
                        this.CaptureMouse();
                    }
                }
                else
                {
                    if (!this.IsMouseCaptured)
                    {
                        if (dStart < dEnd)
                            IsStartPoint = true;
                        else
                            IsStartPoint = false;

                        this.InvalidateVisual();
                        this.CaptureMouse();
                    }
                }
            }

            void LineAdorner_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                if (!IsControlModeOn)
                {
                    if (this.IsMouseCaptured)
                    {
                        System.Windows.Shapes.Line line = this.AdornedElement as System.Windows.Shapes.Line;
                        LineItem lineItem = line.DataContext as LineItem;
                        Point p = snap.Snap(e.GetPosition(line), SnapToGrid.SnapMode.Move);

                        if (IsStartPoint)
                        {
                            line.X1 = p.X;
                            line.Y1 = p.Y;
                        }
                        else
                        {
                            line.X2 = p.X;
                            line.Y2 = p.Y;
                        }
                        this.InvalidateVisual();
                        this.ReleaseMouseCapture();
                    }
                }
            }

            void LineAdorner_MouseMove(object sender, MouseEventArgs e)
            {
                if (this.IsMouseCaptured)
                {
                    if (this.AdornedElement.GetType() == typeof(System.Windows.Shapes.Line))
                    {
                        System.Windows.Shapes.Line line = this.AdornedElement as System.Windows.Shapes.Line;
                        LineItem lineItem = line.DataContext as LineItem;
                        Point p = snap.Snap(e.GetPosition(line), SnapToGrid.SnapMode.Move);

                        // mode: move start or end point


                        if (IsStartPoint)
                        {
                            line.X1 = p.X;
                            line.Y1 = p.Y;
                        }
                        else 
                        {
                            line.X2 = p.X;
                            line.Y2 = p.Y;
                        }

                        // mode: move line


                        //if (IsStartPoint)
                        //{
                        //    double dX = line.X1 - p.X;
                        //    double dY = line.Y1 - p.Y;
                        //    Point pEnd = new Point(line.X2 - dX, line.Y2 - dY);

                        //    line.X1 = p.X;
                        //    line.Y1 = p.Y;
                        //    line.X2 = pEnd.X;
                        //    line.Y2 = pEnd.Y;
                        //}
                        //else
                        //{
                        //    double dX = line.X2 - p.X;
                        //    double dY = line.Y2 - p.Y;
                        //    Point pStart = new Point(line.X1 - dX, line.Y1 - dY);

                        //    line.X1 = pStart.X;
                        //    line.Y1 = pStart.Y;
                        //    line.X2 = p.X;
                        //    line.Y2 = p.Y;
                        //}


                        this.InvalidateVisual();
                    }
                }
            }
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900