Existe-t-il un moyen dans Silverlight 4 de dicter que tous les éléments d'un StackPanel
doivent avoir une marge, au lieu de spécifier margin="10,0"
sur chacun d'entre eux?Silverlight: Tous les descendants d'un élément ont-ils une marge?
Répondre
Mettez votre StackPanel dans un élément de frontière et définir la frontière Rembourrage à « 10 0 »
Je crains que ce n'est pas possible déclarative en XAML avec le StackPanel
directement. C'est la philosophie conceptuelle dans Silverlight/WPF qu'un panel ne devrait pas modifier les propriétés de ses enfants. Ainsi, vous pouvez mettre en œuvre votre propre groupe qui fait de toute façon, ou vous pouvez utiliser une ItemsControl
comme ça:
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentPresenter Margin="10,0" Content="{Binding Content}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
[...]
</ItemsControl>
Un ItemsControl
utilise un StackPanel
par défaut, vous pouvez utiliser sa propriété ItemsPanel
pour définir un autre panneau comme ItemsPanelTemplate
si vous le souhaitez.
Vous pouvez également vous assurer que ItemsControl se comporte comme un StackPanel en spécifiant son 'ItemsPanel' à un StackPanel. Bien que ce soit probablement le défaut. Au moins, vous pouvez contrôler l'orientation. –
Vous pouvez également le faire par programme; votre StackPanel a une collection enfants. Vous pouvez l'utiliser pour parcourir et définir la marge.
La façon dont je le ferais est en définissant des styles implicites dans les ressources de StackPanel, pour chaque type de contrôle qui sera utilisé dans le StackPanel. Pour enregistrer la définition de la valeur à plusieurs reprises pour chaque type de contrôle, vous pouvez créer un style de base nommé qui cible FrameworkElement et définit le (s) style (s) à partir duquel le style de chaque type de contrôle peut hériter. Un exemple est ci-dessous:
<StackPanel Orientation="Horizontal">
<StackPanel.Resources>
<Style x:Key="CommonStyle" TargetType="FrameworkElement">
<Setter Property="Margin" Value="10,0" />
</Style>
<Style TargetType="Button" BasedOn="{StaticResource CommonStyle}" />
<Style TargetType="TextBlock" BasedOn="{StaticResource CommonStyle}" />
<Style TargetType="CheckBox" BasedOn="{StaticResource CommonStyle}" />
</StackPanel.Resources>
<Button>Button</Button>
<TextBlock Text="Text" />
<CheckBox>Check Box</CheckBox>
</StackPanel>
Notez comment chaque contrôle dans le StackPanel aura la marge appliquée, sans avoir besoin de définir sur chaque commande.
Hope this helps ...
Chris Anderson
PS. Auto-promotion flagrante - ceci est basé sur le tour de l'héritage dans mon livre Pro Business Applications with Silverlight 4 :).
Pourquoi la bordure est-elle nécessaire lorsque StackPanel a une propriété Margin? Cela ne tient pas non plus compte de la marge entre chaque enfant, ce que le PO veut probablement faire. –