Comment dois-je espacer les éléments enfants d'un StackPanel?
Donné un StackPanel:
<StackPanel>
<TextBox Height="30">Apple</TextBox>
<TextBox Height="80">Banana</TextBox>
<TextBox Height="120">Cherry</TextBox>
</StackPanel>
Quel est le meilleur moyen d'espacer les éléments enfants de sorte qu'il y a aussi de la taille des espaces entre elles, même si l'enfant les éléments eux-mêmes sont de tailles différentes? Peut-il être fait sans l'aide des propriétés de chacun des enfants?
Vous devez vous connecter pour publier un commentaire.
Utilisation de la Marge ou du Rembourrage, appliquée à la portée à l'intérieur du conteneur:
EDIT: Dans le cas où vous souhaitez ré-utiliser la marge entre les deux récipients, vous pouvez convertir la valeur de la marge à une ressource à l'extérieur de son champ d'application, f.e.
et reportez-vous ensuite à cette valeur dans l'intérieur de la portée
FrameworkElement
.Button
.Label
vous devez utiliserPadding
au lieu deMargin
Grid.IsSharedSizeScope="True"
aussi ce qui me permet d'avoir la grille partagée de la taille des groupes dans mon sous-grilles.Une autre belle approche peut être vu 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
Il montre comment créer un comportement attaché à un, de sorte que la syntaxe de ce genre:
C'est le plus facile & moyen le plus rapide pour définir la Marge de plusieurs enfants d'un groupe spécial, même si elles ne sont pas du même type. (I. e. Boutons, zones de texte, zones de liste modifiables, etc.)
if (fe.ReadLocalValue(FrameworkElement.MarginProperty) == DependencyProperty.UnsetValue)
avant l'établissement de la marge de l'enfant, il permet de spécifier manuellement les marges de certains éléments.J'ai amélioré sur Elad Katz réponse.
Code Source dans les gist.
Exemple:
ItemsControl
lié à l'évolution de la collecte. Il suppose que les éléments sont statiques à partir du moment où le parent estLoad
événement se déclenche.La chose que vous voulez vraiment faire est de placer tous les éléments enfants. Dans ce cas, vous devez utiliser un des éléments de contrôle et de ne pas recourir à l'horrible propriétés jointes qui vous aurez millions de dollars pour chaque propriété que vous désirez style.
Margin="0 0 -5 0"
) seront également contre l'espacement après le dernier élément de la liste.+1 pour Sergey réponse. Et si vous souhaitez appliquer qu'à tous vos StackPanels vous pouvez faire ceci:
Mais méfiez-vous: si vous définissez un style de ce genre dans votre Application.xaml (ou un autre dictionnaire qui est fusionné dans l'Application.Ressources), il peut remplacer le style par défaut de la commande. Pour la plupart des lookless contrôles comme le stackpanel il n'est pas un problème, mais pour les zones de texte, etc vous pouvez tomber sur ce problème, qui, heureusement, a quelques solutions de contournement.
Suivi Sergey suggestion, vous pouvez définir et réutiliser un ensemble de Style (avec divers accesseurs de propriété, y compris la Marge) au lieu de juste l'Épaisseur de l'objet:
...
Noter que l'astuce ici est l'utilisation de l'Héritage des styles pour le style implicite, l'héritage du style dans certains extérieur (probablement fusionné externes dans le fichier XAML) dictionnaire de ressources.
Note:
Au premier abord, j'ai naïvement essayé d'utiliser le style implicite de définir le Style de la propriété du contrôle pour que l'extérieur de Style ressource (disons défini avec la touche "MyStyle"):
qui a causé Visual Studio 2010 pour arrêter immédiatement avec de l'ÉCHEC CATASTROPHIQUE erreur (HRESULT: 0x8000FFFF (E_UNEXPECTED)), comme décrit au https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails-with-catastrophic-failure-when-a-style-tries-to-set-style-property#
De la grille.ColumnSpacing, De la grille.RowSpacing, StackPanel.L'espacement sont maintenant sur UWP aperçu, toutes les permettra de mieux réaliser ce qui est demandé ici.
Ces propriétés sont actuellement uniquement disponible avec Windows 10 à l'Automne Créateurs de mise à Jour d'Initié SDK, mais doit se rendre à la finale de bits!
La UniformGrid peuvent ne pas être disponibles dans Silverlight, mais quelqu'un l'a porté à partir de WPF. http://www.jeff.wilcox.name/2009/01/uniform-grid/
Mon approche hérite StackPanel.
Utilisation:
Tout ce qui est nécessaire est la suivante: classe
parfois, vous devez définir le Rembourrage, pas de Marge pour faire de l'espace entre les éléments plus petits que par défaut