Pregunta

Estoy buscando conectar o pegar dos formas u objetos con una Línea. Estas formas se generarán dinámicamente, lo que significa que llamaré a un servicio web en el back-end para determinar cuántos objetos / formas deben crearse. Una vez que esto se determine, necesitaré tener los objetos / formas conectados entre sí.

La firma del método puede verse así (similar a las capacidades de dibujo de Visio):

GlueTogether(objButton1, objButton2);

Puede que necesite obtener la posición de cada forma de Rectángulo o Botón para determinar dónde está el punto de Línea de inicio. Luego determine la segunda forma / posición de los objetos para dibujar la línea.

¡Cualquier ayuda o sugerencia sería genial!

¿Fue útil?

Solución

  1. Use una ruta o una línea debajo de las formas en orden de apilamiento o índice z
  2. Use instance.TransformToVisual () para obtener la transformación de cada forma
  3. Usa la transformación para transformar el punto central de cada forma
  4. Dibuja una línea entre los dos puntos centrales.

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

Otros consejos

Estoy intentando lo mismo, pero en lugar de que la línea vaya de un centro a otro, quiero que las líneas se detengan en el borde de las dos formas. En particular, tengo flechas al final de las líneas, y las flechas deben detenerse en los límites de las formas en lugar de ir dentro / detrás de la forma a su centro.

Mi forma es un control de usuario con una cuadrícula y un rectángulo, y algunas etiquetas y otras cosas. No puedo encontrar ningún método que me proporcione una geometría para el borde de la forma (que es un rectángulo redondeado).

Descubrí una solución que usa el cuadro delimitador y los puntos de intersección para conectar mis elementos por líneas en sus bordes aproximados, y funciona bien para mí usando líneas terminadas con flechas.

Consulte Conectando dos Elementos de lienzo de WPF por línea, sin usar anclajes?

Mira esto: http: //www.graphspe. com / Main.aspx # / Solution / graphviz-xaml-renderer

Todo lo que tiene que hacer es imprimir en una cadena y obtener su diagrama Silverlight [2 | 3].

Ceyhun

Además ... En lugar de conectarse al punto central de sus objetos, he modificado el mismo código de Michael S. para:

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

Esto se conectará en las partes externas de cada objeto.

Estoy usando el código anterior para dibujar dos botones, quiero una línea entre esos dos botones, pero todo lo que obtengo son dos botones que parecen pequeños círculos y no hay línea.

código:

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top