Étant donné un StackPanel:
<StackPanel>
<TextBox Height="30">Apple</TextBox>
<TextBox Height="80">Banana</TextBox>
<TextBox Height="120">Cherry</TextBox>
</StackPanel>
Quelle est la meilleure façon d'espacer les éléments enfants afin qu'il y ait des espaces de taille égale entre eux, même si les éléments enfants eux-mêmes sont de tailles différentes? Cela peut-il être fait sans définir de propriétés sur chacun des enfants individuels?
wpf
silverlight
xaml
stackpanel
GraemeF
la source
la source
Réponses:
Utilisez Margin ou Padding, appliqué à la portée dans le conteneur:
EDIT: Dans le cas où vous voudriez réutiliser la marge entre deux conteneurs, vous pouvez convertir la valeur de la marge en une ressource dans une portée externe, fe
puis faites référence à cette valeur dans la portée interne
la source
Button
.Label
vous devez utiliser à laPadding
place deMargin
Une autre approche intéressante peut être vue ici: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between- items-in-stackpanel.aspx Le lien est cassé -> ceci est l'archive web de ce lien.
Il montre comment créer un comportement attaché, afin qu'une syntaxe comme celle-ci fonctionne:
C'est le moyen le plus simple et le plus rapide de définir Margin sur plusieurs enfants d'un panneau, même s'ils ne sont pas du même type. (Boutons Ie, TextBoxes, ComboBoxes, etc.)
la source
if (fe.ReadLocalValue(FrameworkElement.MarginProperty) == DependencyProperty.UnsetValue)
avant de définir réellement la marge de l'enfant permet de spécifier manuellement les marges pour certains éléments.J'ai amélioré la réponse d'Elad Katz .
Code source dans l'essentiel .
Exemple:
la source
ItemsControl
liaison à une collection changeante. Il suppose que les éléments sont statiques à partir du moment où l'Load
événement du parent se déclenche.La chose que vous voulez vraiment faire est d'encapsuler tous les éléments enfants. Dans ce cas, vous devez utiliser un contrôle d'objets et ne pas recourir à d'horribles propriétés attachées dont vous finirez par avoir un million pour chaque propriété que vous souhaitez styliser.
la source
Margin="0 0 -5 0"
) va également contrer l'espacement après le dernier élément de la liste.+1 pour la réponse de Sergey. Et si vous souhaitez appliquer cela à tous vos StackPanels, vous pouvez le faire:
Mais attention: si vous définissez un style comme celui-ci dans votre App.xaml (ou dans un autre dictionnaire qui est fusionné dans Application.Resources), il peut remplacer le style par défaut du contrôle. Pour la plupart des contrôles sans apparence comme le stackpanel, ce n'est pas un problème, mais pour les zones de texte, etc., vous pouvez tomber sur ce problème , qui a heureusement quelques solutions de contournement.
la source
Suite à la suggestion de Sergey, vous pouvez définir et réutiliser un style entier (avec divers paramètres de propriété, y compris Margin) au lieu d'un simple objet Thickness:
...
Notez que l'astuce ici est l'utilisation de l'héritage de style pour le style implicite, héritant du style dans un dictionnaire de ressources externe (probablement fusionné à partir d'un fichier XAML externe).
Sidenote:
Au début, j'ai naïvement essayé d'utiliser le style implicite pour définir la propriété Style du contrôle sur cette ressource Style externe (par exemple définie avec la clé "MyStyle"):
qui a provoqué l'arrêt immédiat de Visual Studio 2010 avec une erreur CATASTROPHIC FAILURE (HRESULT: 0x8000FFFF (E_UNEXPECTED)), comme décrit à https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails -avec-un-échec-catastrophique-quand-un-style-essaie-de-définir-une-propriété de style #
la source
Grid.ColumnSpacing , Grid.RowSpacing , StackPanel.Spacing sont maintenant en aperçu UWP, tout permettra de mieux accomplir ce qui est demandé ici.
Ces propriétés ne sont actuellement disponibles qu'avec le SDK Windows 10 Fall Creators Update Insider, mais devraient atteindre les derniers éléments!
la source
UniformGrid n'est peut-être pas disponible dans Silverlight, mais quelqu'un l'a porté à partir de WPF. http://www.jeff.wilcox.name/2009/01/uniform-grid/
la source
Mon approche hérite de StackPanel.
Usage:
Tout ce dont vous avez besoin est le court cours suivant:
la source
Parfois, vous devez définir Padding, pas Margin pour rendre l'espace entre les éléments plus petit que la valeur par défaut
la source