在wpf中绘制形状之间的连接器

时间:2016-10-21 07:27:43

标签: c# wpf canvas

我正在从动态代码创建一些形状并将它们添加到Grid并进一步将Grid添加到Canvas。

因此,当我双击一个形状时,我应该能够添加一些工作正常的文本。现在假设我在Canvas上有两个形状,当我尝试在这些形状之间绘制一条线时,由于某种原因,第一个形状被拉到底部,线从第一个形状的中间开始。

我希望形状不要改变位置,并且线应该从第一个形状的底部开始。请查看我的问题的图像。 enter image description here

请帮助你的想法。这是我的代码。我也试过很多帖子,例如:Getting the top left coordinates of a WPF UIElement。 但他们似乎都没有帮助。

    private void CvsSurface_OnDrop(object sender, DragEventArgs e) //In this event I am creating a shape dynamically and adding to a grid which is then added to a canvas.
        {
            Shape result = null;
            Object droppedData = e.Data; //This part is not important

            /*Translate Drop Point in reference to Stack Panel*/
            Point dropPoint = e.GetPosition(this.cvsSurface);

            //Console.WriteLine(dropPoint);
            //Label lbl = new Label();
            //lbl.Content = draggedItem.Content;
            UIElement element = draggedItem.Content as UIElement;
            Shape s = element as Shape;
            if (s is Ellipse)
            {
                Ellipse ellipse = new Ellipse()
                {
                    Height = s.Height,
                    Width = s.Width,
                    Fill = s.Fill
                };
                result = ellipse;
            }
            else if (s is Rectangle)
            {
                Rectangle rectangle = new Rectangle()
                {
                    Height = s.Height,
                    Width = s.Width,
                    Fill = s.Fill
                };
                result = rectangle;
            }
            Grid sp = new Grid();
            sp.Children.Add(result);
            sp.MouseLeftButtonDown += Sp_MouseLeftButtonDown;
            sp.MouseLeftButtonUp += Sp_MouseLeftButtonUp;
            //sp.PreviewMouseLeftButtonUp += Sp_PreviewMouseLeftButtonUp;
            //sp.MouseLeftButtonUp += Sp_MouseLeftButtonUp;
            cvsSurface.Children.Add(sp);

            Canvas.SetLeft(sp, dropPoint.X);
            Canvas.SetTop(sp, dropPoint.Y);

        }

private void Sp_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) // The purpose of this event lets say when some one clicks on a shape and drags the mouse to the other shape and when mouse up I want to draw a line between the shapes.
        {
            bool mouserelease = System.Windows.Input.Mouse.LeftButton == MouseButtonState.Pressed;
            if (!mouserelease)
            {
                x2 = e.GetPosition(stackpanel).X;
                y2 = e.GetPosition(stackpanel).Y;
                Line l = new Line();
                l.X1 = x1;
                l.Y1 = y1;
                l.X2 = x2;
                l.Y2 = y2;
                l.Margin = new Thickness(0, 19, 0, 0);
                l.Stroke = new SolidColorBrush(Colors.Black);
                l.StrokeThickness = 2;
                stackpanel.Children.Add(l);
            }
        }

 private void Sp_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) //This method lets say if user clicks twice then he wants to add some text or if he single clicks then I am assuming he is trying to a drag and draw a line
        {
            stackpanel = sender as Grid; //Sorry, the stackpanel is a global variable name of type Grid. Its actually Grid stackpanel;

            if (e.ClickCount == 2)
            {
                dialog = new UserDialog()
                {
                    DataContext = this,
                    Height = 180,
                    Width = 400,
                    MaxHeight = 180,
                    MaxWidth = 400
                };
                dialog.ShowDialog();
            }
            else
            {
                x1 = e.GetPosition(stackpanel).X + 18;
                y1 = e.GetPosition(stackpanel).Y + 18;
                //x1 = GetPosition(stackpanel, cvsSurface).X;
                //y1 = GetPosition(stackpanel, cvsSurface).Y;
            }
        }

0 个答案:

没有答案