ItemsControl, ItemsPanel и ItemsPresenter (Silverlight, XAML)

Я совершенно смущен этими 3 терминами, когда использовать какие? Каковы отношения, и они дети, от которых контролирует?

Правильно ли сказать, что это дерево:

ItemsControl> ItemsPresenter> ItemsPanel

2 ответа

Решение

ItemsControl концептуально это элемент управления, в котором находятся предметы. Попробуйте просто думать об этом элементе управления как о держателе для нуля или более объектов.

ItemsPresenter немного сложнее объяснить, но это часть ItemsControl Шаблон, который будет определять, где элементы размещены в нем. Шаблон ItemsControl может быть любым, скажем, Grid с несколькими красивыми картинками вокруг него, внутри этого шаблона вы бы поместили 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, установленным на Horizontal.

Это все имеет смысл?

Я думаю, что это в значительной степени объясняет, как все выполняется Silverlight: ItemsPanelTemplate Class:Определяет панель, которую 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>
Другие вопросы по тегам