将两个形状连接在一起,Silverlight 2

时间:2009-01-22 03:21:03

标签: c# wpf silverlight expression

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

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

GlueTogether(objButton1, objButton2);

我可能需要获取每个Rectangle形状或Button的位置以确定起始线点的位置。然后确定第二个形状/物体位置以绘制线条。

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

5 个答案:

答案 0 :(得分:7)

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

  6. 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
    };
    

答案 1 :(得分:0)

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

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

我找到了一个解决方案,它使用边界框和交叉点在我们的近似边缘用线条连接我的元素,并且使用箭头结束的线条对我来说效果很好。

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

答案 2 :(得分:0)

检查出来:http://www.graphspe.com/Main.aspx#/Solution/graphviz-xaml-renderer

您需要做的就是将printf转换为字符串,然后获得Silverlight [2 | 3]图表。

Ceyhun

答案 3 :(得分: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))
};

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

答案 4 :(得分: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);