【问题标题】:ItemsControl, ItemsPanel and ItemsPresenter (Silverlight, XAML)ItemsControl、ItemsPanel 和 ItemsPresenter(Silverlight、XAML)
【发布时间】:2011-04-13 00:57:42
【问题描述】:

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

说这是树对吗:

ItemsControl > ItemsPresenter > ItemsPanel

【问题讨论】:

    标签: silverlight xaml itemscontrol itemspanel itemspresenter


    【解决方案1】:

    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。

    这一切都有意义吗?

    【讨论】:

    • 如果你能举出所有 3 个正在使用的例子.. 会很棒。我之前遇到的 msdn 示例并不是那么好(即,它太烂了)所以我认为 itemspresenter 正在转移 ControlTemplate,它可以包含一个 ItemsPanel 以在 ControlTemplate 中包含更多项目?
    • 这是一个概念性问题,还是您在尝试创建自己的 ItemsControl 时遇到问题?
    • 概念性的,但只是想好好理解它。
    • 好的,所以ControlTemplate 将定义ItemsControl 的外观,因为它是控件的模板。在ControlTemplate 内部是放置ItemsPresenter 的位置,这是一个占位符控件,它将插入(或“在运行时替换”)ItemsPanel,它可能是一个包含您的项目的 StackPanel、Grid(或其他)。关于 SL 要记住的一点是,它的构建是“无外观”的,这基本上意味着它的全部与行为有关,而不是锁定的外观和感觉。
    • ...抱歉不是按回车的意思...基本上,所有控件类,如ButtonItemsControl 都被定义为具有行为,而不是与特定外观相关联(例如例如,按钮是“您单击的东西”,而不是“看起来像您单击的东西”)。然而,这意味着必须有大量不同的模板挂钩来构建您正在创建的任何内容的最终外观,例如列表框,这导致了围绕大量模板和演示者的常见混淆。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2019-07-05
      • 2021-11-22
      相关资源
      最近更新 更多