Pergunta

Eu estou olhando para ligar ou cola juntos duas formas ou objetos com uma linha. Estas formas serão gerados dinamicamente, ou seja, eu vou estar chamando um serviço Web no backend para determinar quantos objetos / formas precisam ser criados. Uma vez que este é determinado, vou precisar de ter os objetos / formas ligados entre si.

A assinatura do método pode ser parecido com este (similar às capacidades de desenho do Visio):

GlueTogether(objButton1, objButton2);

I pode precisar de obter a posição de cada forma de retângulo ou botão para determinar onde o ponto de linha de partida é. Em seguida, determinar a segunda forma / objetos posição para desenhar a linha.

Qualquer ajuda ou sugestões seria ótimo!

Foi útil?

Solução

  1. Use um caminho ou uma linha abaixo das formas, a fim ou índice z empilhamento
  2. Use instance.TransformToVisual () para obter a transformação de cada forma
  3. Use a transformação para transformar o ponto central de cada forma
  4. Desenhar uma linha entre os dois pontos centrais.

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

Outras dicas

Eu estou tentando a mesma coisa, mas em vez da linha que vai de um centro a outro Quero que as linhas de parar na borda das duas formas. Em particular eu tenho setas no final das linhas, e as setas precisa parar nos limites das formas em vez de ir para dentro / por trás da forma para seu centro.

A minha forma é um usercontrol com uma grade e retângulo, e alguns rótulos e outras coisas. Não consigo encontrar quaisquer métodos que fornecem me com uma geometria para a borda da forma (que é um retângulo arredondado).

Eu descobri uma solução que usa os pontos da caixa delimitadora e intersecção para ligar os meus elementos por linhas em suas bordas aproximados, e ele funciona bem para mim usando seta terminou linhas.

Consulte conectando dois WPF lona elementos por uma linha, sem o uso de âncoras?

Veja isto: http: //www.graphspe. com / Main.aspx # / Solução / graphviz-xaml-renderizador

Tudo que você tem a fazer é printf em uma string e você começa a sua Silverlight. [2 | 3] diagrama

Ceyhun

Além disso ... Em vez de ligar para o ponto central de seus objetos, eu modificado o mesmo 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))
};

Isto irá ligar as porções exteriores de cada objecto.

Eu estou usando o código acima para desenhar dois botões, eu quero uma linha entre esses dois botões, mas tudo que eu vejo são dois botões que se parecem com pequenos círculos e nenhuma linha.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top