Соединение двух динамично созданных линий использования форм формирует в Silverlight

Я работаю над видом блок-схемы применения в asp.net использование Silverlight.. Я - новичок в Silvelight, Создавая элементы (Прямоугольник, Эллипс, Линия..) динамично использующий Объекты фигуры и Объекты линии в codebehind (c#)

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

как соединить динамично созданные формы с линией в Silverlight как блок-схема.

I read the below article, but its not working for me, actualHeight & actualWidth of shapes values are 0. Connecting two shapes together, Silverlight 2

here is my MainPage.xaml




    
    <button x:Name="btnPush" Content="AddRectangle" Height="20" Width="80" Margin="12,268,348,12" Click="btnPush_Click"></button>               

code behind MainPage.xaml.cs

    StackPanel sp1 = new StackPanel();

    public MainPage()
    {
        InitializeComponent();
        sp1.Orientation = Orientation.Vertical;
        MyCanvas.Children.Add(sp1);
    }

    Rectangle rect1;
    Rectangle rect2;
    Line line1;

    private void btnPush_Click(object sender, RoutedEventArgs e)
    {
        rect1 = new Rectangle()
        {
            Height = 30,
            Width = 30,
            StrokeThickness = 3,
            Stroke = new SolidColorBrush(Colors.Red),
        };
        sp1.Children.Add(rect1);           

        rect2 = new Rectangle()
        {
            Height = 30,
            Width = 30,
            StrokeThickness = 3,
            Stroke = new SolidColorBrush(Colors.Red),
        };
        sp1.Children.Add(rect2);

        connectShapes(rect1, rect2);
    }

    private void connectShapes(Shape s1, Shape s2)
    {
        var transform1 = s1.TransformToVisual(s1.Parent as UIElement);
        var transform2 = s2.TransformToVisual(s2.Parent as UIElement);

        var lineGeometry = new LineGeometry()
          {
              StartPoint = transform1.Transform(new Point(1, s1.ActualHeight/2.0)),
              EndPoint = transform2.Transform(new Point(s2.ActualWidth, s2.ActualHeight/2.0))
          }; 

        var path = new Path()
        {
            Data = lineGeometry,
            Stroke = new SolidColorBrush(Colors.Green),
        };
        sp1.Children.Add(path);          
    }

что я делаю в событии щелчка кнопки, просто добавляют две прямоугольных фигуры и Тринг, чтобы соединить их с линией (как блок-схема). Пожалуйста, предложите что не так в моем коде..

1
nl ja de

1 ответы

Попытайтесь заменить линию

    connectShapes(rect1, rect2);

с

    Dispatcher.BeginInvoke(() => connectShapes(rect1, rect2));

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

The TransformToVisual method behaves in much the same way as the ActualWidth and ActualHeight properties. It will return an identity transformation if the shape hasn't been rendered. Even if your lines were being drawn с a definite width and height, they would end up being drawn all on top of one another at the top-left.

I also found that I needed to add the lines to the Canvas, not the StackPanel, in order for them to be drawn over the rectangles. Otherwise the StackPanel quickly filled up с lines с a lot of space above them.

0
добавлено