我有一个像这样设置的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将一个集合的元素显示为Canvas中的Polygons。但我还想在这个Canvas中添加另一个Polygon,这里名为“ShipPolygon”。我不能这样做,因为我得到一个XMLParseException。这样做的正确方法是什么?提前谢谢!
答案 0 :(得分:4)
您正在使用ItemsControl,它可以在itemspanel上显示多个类似的项目。
现在很明显你不能在你的ItemsPanelTemplate
添加一些内容,你只是告诉itemscontrol它应该使用哪个面板来显示它的项目。
您的ItemsSource和ItemTemplate建议您只想在ItemsControl中显示Asteroids。所以最简单的方法就是用你的小行星将你的船覆盖到物品控制上
<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,但是然后需要使用不同的ItemTemplates。你需要处理的是,你的ItemsControl不再仅仅拥有小行星。 使用隐式项目模板
<!-- 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。