Вопрос по connect, silverlight, c#, line – сделать линию, которая соединяет два объекта в Silverlight

0

как я могу соединить эти ящики сущностей?

поля создаются нажатием кнопки, и их можно перетаскивать. Теперь я хочу соединить их линией или чем-то еще.

Ваш Ответ

2   ответа
0
Вы должны получить положение каждой коробки;НарисоватьPath между ящиками;Перерисовать на окнах перетаскивание ...

Rectangle

XAML:

<canvas x:name="Root">
    <rectangle x:name="rect1" fill="Aqua" width="20" height="20" canvas.left="24" canvas.top="44">
    <rectangle x:name="rect2" fill="Red" width="20" height="20" canvas.left="119" canvas.top="73">
</rectangle></rectangle></canvas>

C #:

ConnectBoxes(Root, rect1, rect2);
....

public void ConnectBoxes(Canvas container, Rectangle boxeSrc, Rectangle boxeDest)
{
    var transform1 = boxeSrc.TransformToVisual(container);
    var transform2 = boxeDest.TransformToVisual(container);

    var lineGeometry = new LineGeometry()
    {
        StartPoint = transform1.Transform(
            new Point(boxeSrc.ActualWidth / 2, boxeSrc.ActualHeight / 2.0)
        ),
        EndPoint = transform2.Transform(
            new Point(boxeDest.ActualWidth / 2.0, boxeDest.ActualHeight / 2.0)
        )
    };
    container.Children.Add(new Path()
    {
        Data = lineGeometry,
        Fill = new SolidColorBrush(Colors.Brown),
        Stroke = new SolidColorBrush(Colors.Brown),

    });
}
Вы знаете, как сделать так, чтобы путь перетаскивался по прямоугольникам? terrorista
этот пример хорош, но как я могу сделать это без готовых объектов? я'Я предполагаю, что лучший способ сделать линии - нажать кнопку, которая позволяет нарисовать линию от одного объекта к другому ... этот пример по ссылке идеален, но он 's на wpf, и я могуэто мой проект: /denisvuyka.wordpress.com/2007/10/13/... terrorista
1

класс, который представляет соединение:

public partial class Connection
{
    public MyBox Box1 { get; set; }
    public MyBox Box2 { get; set; }
    public Line Line { get; set; }
}

Чтобы создать новое соединение, яМы использовали базовую форму: имя источника, адресата и кнопку:

<stackpanel orientation="Horizontal" grid.row="3">
    <textbox width="100" text="{Binding From,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
    <textblock text=" ----> ">
    <textbox width="100" text="{Binding To,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
    </textbox></textblock></textbox></stackpanel>

Вот обработчик:

public string From { get; set; }
public string To { get; set; }

private IList<connection> connections = new List<connection>();
private void Button_Click_2(object sender, RoutedEventArgs e)
{
    MyBox box1 = boxes.Single(b => b.Header == From);
    MyBox box2 = boxes.Single(b => b.Header == To);

    Connection conn = new Connection { Box1 = box1, Box2 = box2, Line = new Line { StrokeThickness = 1, Stroke = Brushes.Black } };
    connections.Add(conn);

    RefreshLinesPositions();

    panel.Children.Add(conn.Line);
}
</connection></connection>

И код RefreshLinesPositions:

private void RefreshLinesPositions()
{
    foreach (Connection conn in connections)
    {
        Point p1 = conn.Box1.TranslatePoint(new Point(0, 0), panel);
        Point p2 = conn.Box2.TranslatePoint(new Point(0, 0), panel);

        double t1 = p1.Y;
        double b1 = p1.Y + conn.Box1.ActualHeight;
        double l1 = p1.X;
        double r1 = p1.X + conn.Box1.ActualWidth;

        double t2 = p2.Y;
        double b2 = p2.Y + conn.Box2.ActualHeight;
        double l2 = p2.X;
        double r2 = p2.X + conn.Box2.ActualWidth;

        if (r1 < l2)
        {
            conn.Line.X1 = r1;
            conn.Line.Y1 = t1 + (b1 - t1) / 2;
            conn.Line.X2 = l2;
            conn.Line.Y2 = t2 + (b2 - t2) / 2;

            conn.Line.Visibility = Visibility.Visible;
        }
        else if (r2 < l1)
        {
            conn.Line.X1 = r2;
            conn.Line.Y1 = t2 + (b2 - t2) / 2;
            conn.Line.X2 = l1;
            conn.Line.Y2 = t1 + (b1 - t1) / 2;

            conn.Line.Visibility = Visibility.Visible;
        }
        else if (b1 < t2)
        {
            conn.Line.X1 = l1 + (r1 - l1) / 2;
            conn.Line.Y1 = b1;
            conn.Line.X2 = l2 + (r2 - l2) / 2;
            conn.Line.Y2 = t2;

            conn.Line.Visibility = Visibility.Visible;
        }
        else if (b2 < t1)
        {
            conn.Line.X1 = l1 + (r1 - l1) / 2;
            conn.Line.Y1 = t1;
            conn.Line.X2 = l2 + (r2 - l2) / 2;
            conn.Line.Y2 = b2;

            conn.Line.Visibility = Visibility.Visible;
        }
        else
        {
            conn.Line.Visibility = System.Windows.Visibility.Collapsed;
        }
    }

И вы вызываете RefreshLinesPositions всякий раз, когда окно перемещается:

private void Box_MouseMove(object sender, MouseEventArgs e)
{
    if (draggedBox != null)
    {
        ...

        RefreshLinesPositions();
    }
}

РЕДАКТИРОВАТЬ: для узлов

НовыйRefreshLinesPosition версия:

private void RefreshLinesPositions()
{
    foreach (Connection conn in connections)
    {
        Point p1 = conn.Box1.TranslatePoint(new Point(0, 0), panel);
        Point p2 = conn.Box2.TranslatePoint(new Point(0, 0), panel);

        double t1 = p1.Y;
        double b1 = p1.Y + conn.Box1.ActualHeight;
        double l1 = p1.X;
        double r1 = p1.X + conn.Box1.ActualWidth;

        double t2 = p2.Y;
        double b2 = p2.Y + conn.Box2.ActualHeight;
        double l2 = p2.X;
        double r2 = p2.X + conn.Box2.ActualWidth;

        if (r1 < l2)
        {
            conn.Line.X1 = r1;
            conn.Line.Y1 = t1 + (b1 - t1) / 2;
            conn.Line.X2 = l2;
            conn.Line.Y2 = t2 + (b2 - t2) / 2;

            conn.Line.Visibility = Visibility.Visible;

            conn.Node1.Text.RenderTransform = new TranslateTransform(r1, t1 + (b1 - t1) / 2);
            conn.Node2.Text.RenderTransform = new TranslateTransform(l2 - conn.Node2.Text.ActualWidth, t2 + (b2 - t2) / 2);
        }
        else if (r2 < l1)
        {
            conn.Line.X1 = l1;
            conn.Line.Y1 = t1 + (b1 - t1) / 2;
            conn.Line.X2 = r2;
            conn.Line.Y2 = t2 + (b2 - t2) / 2;

            conn.Line.Visibility = Visibility.Visible;

            conn.Node1.Text.RenderTransform = new TranslateTransform(l1 - conn.Node1.Text.ActualWidth, t1 + (b1 - t1) / 2);
            conn.Node2.Text.RenderTransform = new TranslateTransform(r2, t2 + (b2 - t2) / 2);
        }
        else if (b1 < t2)
        {
            conn.Line.X1 = l1 + (r1 - l1) / 2;
            conn.Line.Y1 = b1;
            conn.Line.X2 = l2 + (r2 - l2) / 2;
            conn.Line.Y2 = t2;

            conn.Line.Visibility = Visibility.Visible;

            conn.Node1.Text.RenderTransform = new TranslateTransform(l1 + (r1 - l1) / 2, b1);
            conn.Node2.Text.RenderTransform = new TranslateTransform(l2 + (r2 - l2) / 2, t2 - conn.Node2.Text.ActualHeight);
        }
        else if (b2 < t1)
        {
            conn.Line.X1 = l1 + (r1 - l1) / 2;
            conn.Line.Y1 = t1;
            conn.Line.X2 = l2 + (r2 - l2) / 2;
            conn.Line.Y2 = b2;

            conn.Line.Visibility = Visibility.Visible;

            conn.Node1.Text.RenderTransform = new TranslateTransform(l1 + (r1 - l1) / 2, t1 - conn.Node1.Text.ActualHeight);
            conn.Node2.Text.RenderTransform = new TranslateTransform(l2 + (r2 - l2) / 2, b2);
        }
        else
        {
            conn.Line.Visibility = System.Windows.Visibility.Collapsed;
        }
    }
}

Новый обработчик событий: I '

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    MyBox box1 = boxes.Single(b => b.Header == From);
    MyBox box2 = boxes.Single(b => b.Header == To);

    Connection conn = new Connection
    {
        Box1 = box1,
        Box2 = box2,
        Line = new Line { StrokeThickness = 1, Stroke = Brushes.Black },
        Node1 = new Node { Text = new TextBox() },
        Node2 = new Node { Text = new TextBox() }
    };
    connections.Add(conn);

    panel.Children.Add(conn.Line);

    panel.Children.Add(conn.Node1.Text);
    panel.Children.Add(conn.Node2.Text);

    RefreshLinesPositions();
}

мы использовали это для представления узлов: я '

public partial class Node
{
    public string Title { get; set; }
    public TextBox Text { get; set; }
}
я нажимаю на кнопку подключения, но ничего не происходит, может быть, яя делаю что-то не так terrorista
Смотрите в выходных данных, если есть какие-либо ошибки привязки. Pragmateek
получаю ошибки в переводчикеconn.Node1.Text.RenderTransform = new TranslateTransform (r1, t1 + (b1 - t1) / 2); " он говорит, что TranslateTransform не содержит конструктор, который принимает два аргумента terrorista
в обоих случаях terrorista

Похожие вопросы