Подтвердить что ты не робот

ItemsControl, ItemsPanel и ItemsPresenter (Silverlight, XAML)

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

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

ItemsControl > ItemsPresenter > ItemsPanel

4b9b3361

Ответ 1

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, отображались горизонтальным образом, тогда панель элементов yor может быть просто StackPanel с свойством Orientation, установленным в Horizontal.

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

Ответ 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>