在ItemsControl的Canvas中添加额外的元素

时间:2012-05-29 08:29:59

标签: c# wpf xaml wpf-controls

我有一个像这样设置的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。这样做的正确方法是什么?提前谢谢!

1 个答案:

答案 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。