22

我完全被这三个术语弄糊涂了,什么时候用哪个?有什么关系,他们是哪个控件的孩子?

说这是树是否正确:

ItemsControl > ItemsPresenter > ItemsPanel

4

2 回答 2

38

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

这一切都有意义吗?

于 2010-09-16T10:51:32.240 回答
6

我认为这几乎解释了 Silverlight 是如何完成这些事情的: ItemsPanelTemplate 类: 指定 ItemsPresenter 为 ItemsControl 的项目布局创建的面板。 ItemsPanelTemplate 类

 <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>
于 2011-06-09T11:01:35.593 回答