2010-05-18 9 views
31

Je ne trouve aucune bonne documentation pour la propriété attachée Panel.IstItemsHost. Je vois beaucoup d'exemples de personnes le définissant sur le modèle ItemsContainer pour un ItemsControl, mais la non-documentation sur MSDN n'explique pas pourquoi ou quels avantages la propriété confère. J'ai construit beaucoup de conteneurs qui ne définissent pas cette propriété, mais n'ont pas encore remarqué d'effets néfastes.Que fait exactement Panel.IsItemsHost?

Répondre

34

Dites que j'ai un ItemsControl. Je veux utiliser un panneau personnalisé qui fait défiler les éléments vers l'intérieur et vers l'extérieur lorsque vous faites défiler l'écran; son appelé un SwoopPanel. Maintenant, comment puis-je dire à ItemsControl d'utiliser mon SwoopPanel pour contenir les modèles qu'il crée?

La manière rapide est de mettre la ItemsPanel sur la ItemsControl:

<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <lol:SwoopPanel /> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 

Cependant, parfois cela ne fonctionne pas pour vous. Peut-être que vous souhaitez personnaliser la présentation du SwoopPanel dans l'interface utilisateur, et que le seul moyen de contourner ce problème est de changer le modèle de contrôle de ItemsControl. Vous pouvez maintenant ajouter votre SwoopPanel directement au modèle de contrôle et, en utilisant la propriété, le marquer en tant que ItemsHost que ItemsControl mettra tous les éléments modélisés qu'il crée.

<Style TargetType="ItemsControl"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ItemsControl"> 
     <Border CornerRadius="5"> 
      <ScrollViewer VerticalScrollBarVisibility="Hidden"> 
      <lol:SwoopPanel IsItemsHost="True"/> 
      </ScrollViewer> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Avez-vous à le faire dans un sens ou dans l'autre? Non. L'un est-il plus avantageux que l'autre? Eh bien, la deuxième façon vous permet de mieux contrôler l'interface utilisateur, la première est plus facile. Faites votre choix, vraiment. Je ne l'ai jamais fait personnellement en deuxième, mais je pense qu'il pourrait y avoir quelques endroits où cela pourrait être utile.

+0

Donc, fondamentalement, le code ItemsControl notera le contrôle étant défini comme IsItemsHost dans sa hiérarchie, et si aucun ItemsPanelTemplate n'est défini, utiliser cet enfant comme conteneur pour les enfants générés? (Je suppose que c'est possible qu'il pourrait lancer si vous avez un modèle ET un enfant IsItemsHost). – Armentage

+1

IsItemsHost n'est pas une propriété jointe –

+1

@kai merci mis à jour. On dirait un bon candidat; se sent un peu étrange que Panel sait comment ItemsControl est implémenté. – Will

9

Voir http://msdn.microsoft.com/en-us/library/system.windows.controls.panel.isitemshost(v=vs.90).aspx

Essentiellement, ce que dit cet article est que si vous remplacez le ControlTemplate d'un ListBox et que vous voulez une nouvelle mise en page, définissez IsItemsHost = true sur certains panneaux, par exemple un StackPanel. Ensuite, tous les éléments de la ListBox seront automatiquement ajoutés en tant qu'enfants du StackPanel. Si l'orientation de la ListBox est horizontale, la ListBox sera horizontale.

L'autre manière est de définir la propriété ItemsPanel de la ListBox à un ItemsTemplate et dans ce modèle vous avez un StackPanel. Dans ce cas, les éléments ListBox seront ajoutés aux enfants StackPanel comme dans le premier cas. Cependant, vous n'avez pas besoin de définir IsItemsHost = true, cela n'aura absolument aucun effet. Ceci est fait pour vous par le fait que vous définissez la propriété ItemsPanel.

+1

c'est l'explication +1 – mkb

Questions connexes