2010-08-19 86 views
3

我想向畫布添加動態橢圓數並設置橢圓位置(canvas.top,canvas.left)。我嘗試綁定到ItemsControl,但它的每個項目(橢圓)都有一個容器,所以我不能直接設置橢圓位置。我不想要一個項目容器,我只想要一個包含橢圓的畫布。Silverlight - 使用MVVM動態地將橢圓添加到畫布

可以這樣做嗎?

回答

2

試試這個 - 爲我工作 - 我用它將文本塊自由放置在畫布上。

Re:Re:定位項目,當畫布是一個ItemsControl的ItemsPanel 02-26-2010 7:17 AM |

還有另外一種更簡單的解決方案,它在Silverlight 3


<Canvas> 
    <ItemsControl ItemsSource={Binding MyItems}> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <Canvas> 
      <TextBlock Canvas.Left={Binding Left} Canvas.Top={Binding Top} Text={Binding Text} /> 
     </Canvas> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Canvas> 

工作如果MyItems是是一類已經離開項目,頂部和文本公共屬性的列表,這工作正常。我也用線和邊界測試,以得出簡單的柱狀圖的圖形在Silverlight 3

從這個崗位的底部: http://forums.silverlight.net/forums/p/29753/450510.aspx#450510

與Silverlight的DataTemplateSelector結合起來,你可以改變你的對象基於視圖模型性質得出:

http://www.codeproject.com/KB/silverlight/SLTemplateSelector.aspx

2

通常情況下,我會說使用結合的ItemsControlCanvas

<ItemsControl ItemsSource="{Binding Ellipses}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemsContainerStyle> 
     <Style> 
      <Setter Property="Canvas.Left" Value="{Binding Left}"/> 
      <Setter Property="Canvas.Top" Value="{Binding Top}"/> 
     </Style> 
    </ItemsControl.ItemsContainerStyle> 
</ItemsControl> 

但在Silverlight suckiness的顯示,該ItemContainerStyle屬性不上ItemsControl工作。它有支持ItemsControl,但它不是由ItemsControl本身公開。相反,它取決於ItemsControl的子類 - 例如ListBox - 來公開它。哦,這些子類必須由微軟提供,因爲功能是protected internal,所以你不能僅僅子類ItemsControl並且自己公開這些東西。 :S

因此,您可以使用ListBox代替,可能是通過繼承它並將其項容器更改爲比ListBoxItem更簡單的方法。或者,您可以直接使用ListBox並撥動,直到ListBoxItem按照您希望的方式顯示(即未選中)。

+0

那麼有沒有辦法讓周圍的itemContainer? – chief7 2010-08-19 10:32:08

+0

我剛纔在我的帖子中解釋瞭如何:S – 2010-08-19 10:54:09