2009-11-15 12 views
2

J'ai lu la programmation WPF, voici un des exemples sur modèle de contrôle:WPF control-template: pourquoi spécifier une grille sans ColumnDefinations/RowDefinations comme élément d'outter?

<Button DockPanel.Dock="Bottom" x:Name="addButton" Content="Add"> 
    <Button.Template> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Grid> 
       <Ellipse Width="128" Height="32" Fill="Yellow" Stroke="Black" /> 
       <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" /> 
      </Grid> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 

Je me demande pourquoi utiliser une grille, mais pas un panneau simple comme la toile? Puisque nous n'avons pas décalé aucune ligne/colonne?

Merci!

Répondre

2

Si vous ne spécifiez aucune ligne ou colonne, une de chaque est implicite, ce qui vous donne une seule cellule. Ainsi, les deux Ellipse et ContentPresenter occupent la même cellule de la grille. L'ordre z des éléments ajoutés à la même cellule est déterminé par l'ordre dans lequel ils sont ajoutés. Dans ce cas, le ContentPresenter apparaîtra "par-dessus" le Ellipse.

Si vous utilisiez un Canvas au lieu d'un Grid, la taille des enfants ne serait pas limitée par la taille du conteneur. C'est parce qu'un Canvas n'impose aucune restriction de taille sur ses enfants comme le fait le Grid. Par conséquent, vous devez spécifier une taille pour le Ellipse et ContentPresenter, et vous devez connaître la taille du Canvas pour définir cette taille. Ergo, c'est juste beaucoup plus facile et plus intuitif en utilisant un Grid.