0

我有一个这样的 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

1 回答 1

4

您正在使用 ItemsControl,它可以在项目面板上显示多个相似的项目。

现在显然你不能在你ItemsPanelTemplate那里添加一些东西你只是告诉itemscontrol它应该使用哪个面板来显示它的项目。您的 ItemsSource 和 ItemTemplate 建议您只想在 ItemsControl 中显示 Asteroids。所以最简单的方法就是用你的小行星将你的船覆盖在 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,但随后需要使用不同的 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。

于 2012-05-29T09:00:36.247 回答