Я совершенно смущен этими тремя терминами, когда их использовать? Каковы отношения и дети, из которых контролируются?
Можно ли сказать, что это дерево:
ItemsControl > ItemsPresenter > ItemsPanel
Я совершенно смущен этими тремя терминами, когда их использовать? Каковы отношения и дети, из которых контролируются?
Можно ли сказать, что это дерево:
ItemsControl > ItemsPresenter > ItemsPanel
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.
Это все имеет смысл?
Я думаю, что это в значительной степени объясняет, как все это делается 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>