4

我正在寻找用一条线将两个形状或对象连接或粘合在一起。这些形状将动态生成,这意味着我将在后端调用 Web 服务来确定需要创建多少对象/形状。一旦确定了这一点,我需要将对象/形状连接在一起。

方法签名可能如下所示(类似于 Visio 的绘图功能):

GlueTogether(objButton1, objButton2);

我可能需要获取每个 Rectangle 形状或 Button 的位置来确定起始 Line 点的位置。然后确定第二个形状/对象的位置来画线。

任何帮助或建议都会很棒!

4

5 回答 5

7
  1. 在堆叠顺序或 z 索引中使用形状下方的路径或线条
  2. 使用 instance.TransformToVisual() 获取每个形状的变换
  3. 使用变换来变换每个形状的中心点
  4. 在两个中心点之间画一条线。

var transform1 = shape1.TransformToVisual(shape1.Parent as UIElement);
var transform2 = shape2.TransformToVisual(shape2.Parent as UIElement);

var lineGeometry = new LineGeometry()
{
  StartPoint = transform1.Transform(new Point(shape1.ActualWidth / 2, shape1.ActualHeight / 2.0)),
  EndPoint = transform2.Transform(new Point(shape2.ActualWidth / 2.0,    shape2.ActualHeight / 2.0))
};

var path = new Path()
{
Data = lineGeometry
};
于 2009-01-22T07:10:05.223 回答
0

我正在尝试相同的方法,但不是从一个中心到另一个中心的线,我希望这些线停在两个形状的边缘。特别是我在线条的末端有箭头,箭头需要停在形状的边界处,而不是在形状的内部/后面到达它的中心。

我的形状是一个带有网格和矩形的用户控件,以及一些标签和其他东西。我找不到任何方法可以为我提供形状边缘的几何形状(圆角矩形)。

我想出了一个解决方案,它使用边界框和交点通过线在其近似边缘处连接我的元素,并且使用箭头结束的线对我来说效果很好。

请参阅通过一条线连接两个 WPF 画布元素,而不使用锚点?

于 2009-11-14T14:31:09.700 回答
0

看看这个: http: //www.graphspe.com/Main.aspx#/Solution/graphviz-xaml-renderer

您所要做的就是将 printf 打印到一个字符串,然后您就可以得到 Silverlight[2|3] 图。

采洪

于 2009-12-24T11:33:15.810 回答
0

此外......我没有连接到对象的中心点,而是将 Michael S. 的相同代码修改为:

var lineGeometry = new LineGeometry()
{
    StartPoint = transform1.Transform(new Point(1 , b1.ActualHeight / 2.0)),
    EndPoint = transform2.Transform(new Point(b2.ActualWidth , b2.ActualHeight / 2.0))
};

这将在每个对象的外部连接。

于 2010-04-14T17:53:23.657 回答
0

我正在使用上面的代码来绘制两个按钮,我想要在这两个按钮之间有一条线,但我得到的只是两个看起来像小圆圈并且没有线的按钮。

代码:

Button b1 = new Button();
Button b2 = new Button();
canvas1.Children.Add(b1);
canvas1.Children.Add(b2);
Canvas.SetLeft(b1, 300);

var transform1 = b1.TransformToVisual(b1.Parent as UIElement);
var transform2 = b2.TransformToVisual(b2.Parent as UIElement);

var lineGeometry = new LineGeometry()
{
    StartPoint = transform1.Transform(new Point(1, b1.ActualHeight / 2.0)),
    EndPoint = transform2.Transform(new Point(b2.ActualWidth, b2.ActualHeight / 2.0))
};

var path = new Path()
{
    Data = lineGeometry
};

canvas1.Children.Add(path);
于 2011-05-25T16:54:33.223 回答