4 Stimmen

Verbinden von zwei Formen miteinander, Silverlight 2

Ich möchte zwei Formen oder Objekte mit einer Linie verbinden oder zusammenkleben. Diese Formen werden dynamisch generiert, d.h. ich rufe einen Webservice im Backend auf, um festzustellen, wie viele Objekte/Formen erstellt werden müssen. Sobald dies bestimmt ist, muss ich die Objekte/Formen miteinander verbinden.

Die Methodensignatur kann wie folgt aussehen (ähnlich wie bei den Zeichenfunktionen von Visio):

GlueTogether(objButton1, objButton2);

Möglicherweise muss ich die Position der einzelnen Rechteckformen oder Schaltflächen ermitteln, um festzustellen, wo der Startpunkt der Linie liegt. Dann bestimmen Sie die zweite Form/Objektposition, um die Linie zu zeichnen.

Jede Hilfe oder Anregung wäre großartig!

7voto

Michael S. Scherotter Punkte 10585
  1. Verwenden Sie einen Pfad oder eine Linie unter den Formen in Stapelreihenfolge oder z-Index
  2. Verwenden Sie instance.TransformToVisual(), um die Transformation der einzelnen Formen zu erhalten
  3. Verwenden Sie die Transformation, um den Mittelpunkt jeder Form zu transformieren
  4. Ziehen Sie eine Linie zwischen den beiden Mittelpunkten.

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

0voto

angularsen Punkte 7545

Ich versuche das Gleiche, aber anstatt dass die Linie von einer Mitte zur anderen geht, möchte ich, dass die Linien am Rand der beiden Formen aufhören. Insbesondere habe ich Pfeile am Ende der Linien, und die Pfeile müssen an den Grenzen der Formen zu stoppen, anstatt gehen innerhalb / hinter der Form zu seinem Zentrum.

Meine Form ist ein Benutzerkontrollfeld mit einem Raster und einem Rechteck, sowie einigen Beschriftungen und anderen Dingen. Ich kann keine Methoden finden, die mir eine Geometrie für die Kante der Form (die ein abgerundetes Rechteck ist) bieten.

Ich habe eine Lösung gefunden, die den Begrenzungsrahmen und die Schnittpunkte verwendet, um meine Elemente durch Linien an ihren ungefähren Kanten zu verbinden, und es funktioniert gut für mich mit Pfeil endenden Linien.

Ver Verbinden von zwei WPF-Canvas-Elementen durch eine Linie, ohne Verwendung von Ankern?

0voto

Ciper Punkte 19

Sehen Sie sich das an: http://www.graphspe.com/Main.aspx#/Solution/graphviz-xaml-renderer

Alles, was Sie tun müssen, ist printf in einen String zu schreiben und Sie erhalten Ihr Silverlight[2|3]-Diagramm.

Ceyhun

0voto

Scott Stalter Punkte 1

Außerdem... Anstatt mit dem Mittelpunkt Ihrer Objekte zu verbinden, habe ich den gleichen Code von Michael S. geändert, um:

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

Dadurch werden die äußeren Teile jedes Objekts miteinander verbunden.

0voto

Phillip Punkte 31

Ich verwende den obigen Code, um zwei Schaltflächen zu zeichnen, ich möchte eine Linie zwischen diesen beiden Schaltflächen, aber alles, was ich bekomme, sind zwei Schaltflächen, die wie kleine Kreise und keine Linie aussehen.

Code:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X