2009-01-22 33 views
4

我正在寻找连接或用线连接两个形状或对象。这些形状将动态生成,这意味着我将调用后端的Web服务以确定需要创建多少个对象/形状。一旦确定,我需要将物体/形状连接在一起。将两个形状连接在一起,Silverlight 2

方法签名可以是这样的(类似Visio的绘图功能):

GlueTogether(objButton1, objButton2); 

我可能需要获得每个矩形形状或按钮的位置,以确定起跑线点。然后确定绘制线条的第二个形状/对象位置。

任何帮助或建议将是伟大的!

回答

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 
}; 
+0

.FindCommonVisualAncestor是方便的,如果你的形状嵌套在不同的地方 - shape1.TransformToVisual(shape1.FindCommonVisualAncestor(shape2)) – zimmer62 2010-03-12 21:42:32

0

我想大致相同,但不是到其他行从一个中心去我想要的线路停止在两个形状的边缘。 特别是在线条的末端有箭头,箭头需要停留在形状的边界上,而不是在形状的内部/后面到达其中心。

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

我想出了一个解决方案,它使用边界框和交叉点通过它们的近似边缘处的线连接我的元素,并且它对我使用箭头结束行很有帮助。

Connecting two WPF canvas elements by a line, without using anchors?

0

此外...而不是连接到你的对象的中心点,我已经修改了相同的代码从迈克尔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)) 
}; 

这将连接在每个物体的外部。

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);