ItemsControl, ItemsPanel и ItemsPresenter (Silverlight, XAML) - PullRequest
20 голосов
/ 16 сентября 2010

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

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

ItemsControl> ItemsPresenter> ItemsPanel

Ответы [ 2 ]

35 голосов
/ 16 сентября 2010

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.

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

6 голосов
/ 09 июня 2011

Я думаю, что это в значительной степени объясняет, как все это делает Silverlight: ItemsPanelTemplate Class: Определяет панель, которую ItemsPresenter создает для макета элементов ItemsControl.1004 *

 <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>
...