L'inconvénient de mettre les deux contrôles ensemble dans la même cellule est que le second sera superposé au premier (ce que vous auriez remarqué si vous l'aviez essayé), et la seule façon d'y remédier est de leur donner des marges bizarres ou de les mettre tous les deux dans une cellule de type StackPanel
c'est pourquoi tout le monde les met dans un StackPanel
.
Je suggère ceci : Définissez un style comme indiqué ci-dessous, et mettez-le dans une chose globale incluse dans App.xaml
(ou en App.xaml
lui-même, si vous êtes dans un état d'esprit pirate) :
<Style x:Key="FieldStyle" TargetType="HeaderedContentControl">
<Setter Property="Margin" Value="8,3" />
<Setter Property="MinWidth" Value="300" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="HeaderedContentControl">
<StackPanel Orientation="Vertical">
<Label
FontWeight="Bold"
Content="{TemplateBinding Header}"
/>
<ContentPresenter
Margin="8,0,0,0"
/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Et utilise-le comme ça :
<HeaderedContentControl
Header="Contact Name"
Grid.Row="0"
Grid.Column="0"
Style="{StaticResource FieldStyle}"
>
<TextBox Text="{Binding ContactName}" />
</HeaderedContentControl>
<HeaderedContentControl
Header="Contact Phone"
Grid.Row="1"
Grid.Column="0"
Style="{StaticResource FieldStyle}"
>
<TextBox Text="{Binding ContactPhone}" />
</HeaderedContentControl>
Cela vous permet de modifier facilement le formatage de tous vos couples étiquette/contrôle. D'habitude, je me contente d'insérer ces éléments dans un fichier de type StackPanel
o WrapPanel
moi-même, mais si un Grid
a un sens pour votre mise en page, alors n'hésitez pas à le faire.
Le modèle dans ce style pourrait et devrait être TemplateBinding
beaucoup plus de choses que ça ne l'est, mais j'en ai eu marre de taper et il y a tout ce que je vais vraiment utiliser.