Соединение двух фигур вместе, Silverlight 2

Я хочу соединить или склеить две фигуры или объекты с помощью линии. Эти фигуры будут генерироваться динамически, то есть я буду вызывать веб-службу на серверной части, чтобы определить, сколько объектов/форм необходимо создать. Как только это будет определено, мне нужно будет соединить объекты/формы вместе.

Сигнатура метода может выглядеть так (аналогично возможностям рисования Visio):

GlueTogether(objButton1, objButton2);

Мне может понадобиться получить положение каждой прямоугольной формы или кнопки, чтобы определить, где находится начальная точка линии. Затем определите положение второй формы/объектов, чтобы нарисовать линию.

Любая помощь или предложения были бы замечательными!


person nightdev    schedule 22.01.2009    source источник


Ответы (5)


  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
};
person Michael S. Scherotter    schedule 22.01.2009
comment
.FindCommonVisualAncestor Удобен, если ваши фигуры вложены в разных местах -- shape1.TransformToVisual(shape1.FindCommonVisualAncestor(shape2)) - person zimmer62; 13.03.2010

Я пытаюсь почти то же самое, но вместо линии, идущей от одного центра к другому, я хочу, чтобы линии останавливались на краю двух фигур. В частности, у меня есть стрелки в конце линий, и стрелки должны останавливаться на границах фигур, а не идти внутрь/за фигуру к ее центру.

Моя форма представляет собой пользовательский элемент управления с сеткой и прямоугольником, а также некоторыми метками и другими вещами. Я не могу найти какие-либо методы, которые предоставляют мне геометрию для края формы (который представляет собой прямоугольник со скругленными углами).

Я нашел решение, которое использует ограничивающую рамку и точки пересечения для соединения моих элементов линиями на их приблизительных краях, и оно хорошо работает для меня, используя линии со стрелками.

См. раздел Соединение двух элементов холста WPF. по линии, без использования якорей?

person angularsen    schedule 14.11.2009

Проверьте это: http://www.graphspe.com/Main.aspx#/Solution/graphviz-xaml-renderer

Все, что вам нужно сделать, это напечатать строку, и вы получите диаграмму Silverlight[2|3].

Джейхун

person Ciper    schedule 24.12.2009
comment
Плохая ссылка - я получаю страницу в разработке - person Christian Payne; 07.10.2011

Кроме того... Вместо того, чтобы подключаться к центральной точке ваших объектов, я изменил тот же код от Майкла С. на:

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

Это соединит внешние части каждого объекта.

person Scott Stalter    schedule 14.04.2010

Я использую приведенный выше код для рисования двух кнопок, мне нужна линия между этими двумя кнопками, но все, что я получаю, это две кнопки, которые выглядят как крошечные круги без линии.

код:

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);
person Phillip    schedule 25.05.2011