Соединяя две фигуры вместе, Silverlight 2 - PullRequest
4 голосов
/ 22 января 2009

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

Подпись метода может выглядеть следующим образом (аналогично возможностям рисования в Visio):

GlueTogether(objButton1, objButton2);

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

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

Ответы [ 5 ]

7 голосов
/ 22 января 2009
  1. Используйте контур или линию под фигурами в порядке наложения или z index
  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 голосов
/ 25 мая 2011

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

код:

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);
0 голосов
/ 14 апреля 2010

Кроме того ... Вместо того, чтобы соединяться с центральной точкой ваших объектов, я изменил тот же код от 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))
};

Это будет подключаться к внешним частям каждого объекта.

0 голосов
/ 24 декабря 2009

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

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

Джейхун

0 голосов
/ 14 ноября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...