2010-03-18 11 views
1

J'ai un ItemsControl avec le ItemTemplate suivant:Comment définir la hauteur des éléments en XAML afin qu'ils occupent toujours la même proportion d'espace disponible dans le parent ItemsControl?

<DataTemplate x:Key="myItemTemplate"> 
    <TextBlock Height="???" Text="{Binding Path=Description}" /> 
</DataTemplate> 

Ma question est, comment puis-je régler la hauteur du TextBlock dans le modèle afin qu'il assume automatiquement ItemsControl.Height div ItemsCount l'espace vertical?

Quand il n'y a qu'un seul article, je voudrais que ce soit la hauteur totale du conteneur, lorsqu'il y en a deux, chacun devrait être la moitié de la taille, et ainsi de suite.

Si possible, je préférerais faire ceci complètement en XAML pour garder mon ViewModel propre de la logique d'IU.

Répondre

6

Vous pouvez utiliser un UniformGrid comme ItemsPanelTemplate et lier la propriété Rows au nombre d'articles dans votre ItemsControl, comme ceci:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Rows="{Binding Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" IsItemsHost="True"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Je n'ai pas testé ce code, vous devez donc vérifier, mais je pense que l'idée est claire.

EDIT: Comme l'a souligné John ci-dessous, ce code est encore plus facile:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Columns="1" IsItemsHost="True"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 
+4

En fait, c'est plus simple que ça. UniformGrid s'occupera automatiquement du nombre de lignes si vous définissez Columns = "1". Et vous devez utiliser ItemsControl.ItemsPanel à la place de ItemTemplate. –

+0

Oh, c'est cool. Je ne savais pas à ce sujet. Merci pour le conseil! Et merci d'avoir souligné le "bug" dans mon exemple de code. J'ai accidentellement écrit "ItemTemplate" au lieu de "ItemsPanel". Fixé dans le message ci-dessus. – gehho

0

Je vais essayer de ne pas oublier cela comme un exercice intellectuel que je suis très nouveau pour WPF. Je ne doute pas que je serai corrigé en temps voulu. Je pense que vous pouvez spécifier une proportion constante en ajoutant un signe% à la valeur Hauteur, c'est-à-dire Hauteur = "50%". Ceci est trompeur, car il va additionner toutes les valeurs numériques des hauteurs des éléments à l'intérieur du parent, et dimensionner chacun comme sa proportion de cette somme. Par exemple, trois blocs de texte de hauteur = "50%" auront chacun une hauteur (50/150) * hauteur de datatemplate = 1/3.

+0

Je suppose que vous pensez à une grille "en étoile", mais cela ne fonctionnera pas ici car le nombre de lignes n'est pas connu et n'est pas corrigé. Bien, il pourrait y avoir une solution de travail, mais je pense que c'est beaucoup plus de travail. – gehho