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>