В WPF панель элементов ItemsControl
, например ListBox
, может быть заменена на элементы макета другим способом.например:
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
Код выше работает.Но почему WrapPanel
можно поместить внутрь ItemsPanelTemplate
напрямую?ItemsPanelTemplate
имеет свойство VisualTree
, которое унаследовано от класса FrameworkTemplate
.Свойство VisualTree
является свойством содержимого и имеет тип FrameworkElementFactory
.Таким образом, приведенный выше код на самом деле:
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<ItemsPanelTemplate.VisualTree>
<FrameworkElementFactory>
<WrapPanel/>
</FrameworkElementFactory>
</ItemsPanelTemplate.VisualTree>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
Теперь возникает вопрос: FrameworkElementFactory
не имеет свойства содержимого и даже не имеет свойств типа Panel
, так почему же WrapPanel
можно поместить внутрь FrameworkElementFactory
напрямую?