我完全被这三个术语搞糊涂了,什么时候该用哪一个?它们是什么关系,是哪些控件的子控件?
这就是这棵树,这样说对吗?
ItemsControl > ItemsPresenter > ItemsPanel
发布于 2010-09-16 18:51:32
从概念上讲,ItemsControl是一个包含项的控件。试着简单地把这个控件看作是零个或多个对象的持有者。
ItemsPresenter有点难以解释,但这是ItemsControl模板的一部分,它将定义项在其中的放置位置。你的ItemsControl的模板可以是你喜欢的任何东西,比如说一个周围有一些漂亮图片的网格,在这个模板中,你可以把ItemsPresenter放在你想要的任何地方,比如就在网格的中间。(本例取自msdn,为便于阅读,进行了简化)
<Style TargetType="HeaderedItemsControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type HeaderedItemsControl}">
<Grid>
<Rectangle Stroke="Black" Fill="Red"/>
<ItemsPresenter Margin="2,0,0,0"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>ItemsPanel是控制ItemsControl中项目布局的面板(或容器)。因此,如果您希望添加到ItemsControl中的项目以水平方式显示,那么您的项目面板可以是一个方向属性设置为horizotal的StackPanel。
这一切都说得通吗?
发布于 2011-06-09 19:01:36
我认为这很好地解释了Silverlight是如何完成这些工作的: ItemsPanelTemplate类:指定ItemsPresenter为ItemsControl的项目布局创建的面板。 ItemsPanelTemplate Class
<Style TargetType="local:myItemsControl">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:myItemsControl">
....
<ItemsPresenter />
....基本上,ItemPresenter (在模板中指定)将替换为在ItemsPanelTemplate中指定的任何内容。
因此,模板可以扩展为包含一个标头,并且所有的子项都将放在这个标头下:
<Grid> <TextBlock Text="Header"/> <ItemsPresenter /> </Grid>https://stackoverflow.com/questions/3723893
复制相似问题