ItemsControl,ItemsPanel和ItemsPresenter(Silverlight,XAML)

时间:2010-09-16 05:15:13

标签: silverlight xaml itemscontrol itemspanel itemspresenter

我对这3个术语完全感到困惑,何时使用哪个?什么是关系,他们是哪个控制的孩子?

说这是树是否正确:

ItemsControl> ItemsPresenter> ItemsPanel

2 个答案:

答案 0 :(得分:35)

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的项目以水平方式显示,那么yor items面板可能只是一个StackPanel,其Orientation属性设置为Horizo​​ntal。

这一切都有意义吗?

答案 1 :(得分:6)

我认为这几乎解释了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>