2012-05-29 65 views
0

我有一個ItemsControl設立這樣的:額外的元素添加到ItemsControl中的帆布

<Grid> 
    <ItemsControl ItemsSource="{Binding Asteroids}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Canvas Background="Black"> 
         <!-- i want to add another polygon to the canvas--> 
         <!--<Polygon Name ="ShipPolygon" Points="{Binding Ship}" Fill="Blue" />--> 
        </Canvas> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Polygon Fill="Gray" Points="{Binding AsteroidPoints}" /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 

正如你所看到的,是ItemsControl的顯示集合的元素,作爲油畫多邊形。但我也希望到其他多邊形添加到該畫布,這裏命名爲「ShipPolygon」。我不能這樣做,因爲我得到一個XMLParseException。什麼是適當的方法來做到這一點?提前致謝!

回答

4

您正在使用一個ItemsControl,這是存在於顯示器上的itemspanel多個類似的項目。

現在很明顯,你不能講一下你ItemsPanelTemplate有你只告訴其面板應使用以顯示其項目的ItemsControl。 你的ItemsSource和你的ItemTemplate建議你只想要顯示在您的ItemsControl小行星。所以,最簡單的方法是隻覆蓋你的船到的ItemsControl與小行星

<Grid> 
    <ItemsControl ItemsSource="{Binding Asteroids}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Canvas Background="Black"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Polygon Fill="Gray" Points="{Binding AsteroidPoints}" /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
    </ItemsControl> 

    <Polygon Name ="ShipPolygon" Points="{Binding Ship}" Fill="Blue" /> 
</Grid> 

否則,你可以把它添加到藏漢ItemsControl的,但那麼就需要使用不同的ItemTemplate。你需要處理,你的ItemsControl不再僅僅擁有Asteroids。 使用隱式項目模板

<!-- No key, so it is implicit and automatically used--> 
<DataTemplate DataType="{x:Type Asteroids}"> 
    <Polygon Fill="Gray" Points="{Binding AsteroidPoints}" /> 
</DataTemplate> 

<DataTemplate DataType="{x:Type Player}"> 
    <Polygon Name ="ShipPolygon" Points="{Binding Ship}" Fill="Blue" /> 
</DataTemplate> 

<!-- above must be in a resource section, like app.xaml --> 


<Grid> 
    <ItemsControl ItemsSource="{Binding Entities}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Canvas Background="Black"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</Grid> 

或者您可以使用DataTemplateSelector。

+0

偉大的答案,最後一個方法是已被列入小行星收集在船上且具有屬性來識別它(如'IsShip')。然後將附加多邊形添加到原始數據模板中,使用'Visibility =「Collapsed」'並具有數據觸發器來檢查IsShip屬性是否爲真,然後摺疊原始多邊形並使新多邊形可見。 – XAMeLi

+0

感謝您的回答。不是我的問題似乎是完全愚蠢的...... :) @XAMeLi:是的,我正在考慮將該船添加到列表中,但我認爲這種方式更優雅。另外,這樣我可以改變船的形狀。 – WonderCsabo

相關問題