2012-12-28 30 views
1

我正在使用silverlight在asp.net中處理流程類型的應用程序..我是Silvelight的初學者,使用SHAPE動態創建元素(矩形,橢圓,線..)代碼隱藏的線對象(c#)在Silverlight中使用線條連接兩個動態創建的形狀

這些形狀將會動態生成,這意味着我將在後端調用Web服務以確定需要創建多少個對象/形狀。一旦確定,我需要將物體/形狀連接在一起。

如何在流程圖中使用Silverlight中的線條連接動態創建的形狀。

我讀了下面的文章,但它不是爲我工作,的ActualHeight & ActualWidth的形狀值爲0 Connecting two shapes together, Silverlight 2

這裏是我的MainPage.xaml中

<UserControl x:Class="LightTest1.MainPage"> 

<Canvas x:Name="LayoutRoot" Background="White"> 
    <Canvas x:Name="MyCanvas" Background="Red"></Canvas> 
    <Button x:Name="btnPush" Content="AddRectangle" Height="20" Width="80" Margin="12,268,348,12" Click="btnPush_Click"></Button>    
</Canvas> 

代碼背後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);   
    } 

我在按鈕單擊事件中所做的只是添加兩個矩形形狀,並用線連接它們(如流程圖)。 請所說的其實是錯誤的,我的代碼..

回答

0

嘗試用

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

更換線

connectShapes(rect1, rect2); 

我不知道確切的原因,爲什麼這個工作,但我相信只有在控制通過代碼後纔會呈現形狀,並且只有渲染完成後,ActualWidthActualHeight屬性才具有有用的值。調用Dispatcher.BeginInvoke不久後會調用您的代碼;實際上,您可能會注意到矩形之後略微繪製的線條。

TransformToVisual方法的行爲方式與ActualWidthActualHeight屬性非常相似。如果形狀尚未呈現,它將返回一個標識轉換。即使你的線條被繪製成具有一定的寬度和高度,他們最終將在左上方彼此重疊。

我還發現我需要添加行到畫布,而不是StackPanel,以便在矩形上繪製它們。否則,StackPanel很快就會填滿上面有很多空間的行。